HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2021
0730
Area39logfを使って整数の桁数をうまく取得出来ない2解決


Area39

リンク

2021/7/30(Fri) 08:31:56|NO.93371

タイトル通りですが、

msg = "" repeat 3 p = 999 + cnt keta = 1.0 + (logf(p) / logf(10) ) + ( double(int(logf(p)/logf(10))) == logf(p)/logf(10) ) int_keta = int(keta) msg += ""+p+" : "+int_keta+"桁("+keta+")\n\n" loop dialog msg end

999,1000,1001の桁数を取得したいと考えて居ます。
なぜか、1000が3桁とされてしまいます。
これは、4.00000...と表示されていても、3.999999....と
なっているからでしょうか?
単純に0.0000001くらいの小さな数字を足せば良いような気もしますが、
それだとあまり良くないような気がします。
また、これを回避する方法ありましたら教えて下さい
よろしくお願い致します。



この記事に返信する


沢渡

リンク

2021/7/30(Fri) 09:23:26|NO.93373

2番目のketaについて、試しにstrfで小数点以下16桁まで表示してみたら、
確かに3.9999999999999996となっていました。
実数はある程度の誤差が生じるものですから、
あまり厳密さの求められる処理には向かないのではないかと思います。

今回のケースですと、実数を使用せずに、整数だけで完結するような処理に
した方がよいのではないかと。

#module //logi(p1,p2) p2を底とするp1の対数を返す(引数も返値も整数限定) //p2は2以上の値でなければならない。(1以下を指定した場合は-1を返す) #defcfunc logi int x,int b if b<2 : return -1 y=b : res=0 repeat if (y>x)|(y<b) : res=cnt : break y*=b loop return res #global msg = "" repeat 3 p = 999 + cnt int_keta = logi(p,10)+1 msg += strf("%4d : %1d桁\n",p,int_keta) loop dialog msg end



Area39

リンク

2021/7/30(Fri) 22:43:28|NO.93386

沢渡 さま

ありがとうございます、誤差がやはりあったのですね、
解決できてうれしいです
ありがとうございました!!



記事削除

記事NO.パスワード
(質問が解決したスレッドは他の利用者に活用してもらうため、削除しないようお願いします)

NO.93371への返信

マスコット

好きなマスコットを選んでください。

名前

e-mail
HOME
  1. 初めて利用する方は、HSP3掲示板の使い方をお読みください。
  2. 不要部分の多い長いスクリプトの投稿は ご遠慮ください。
  3. 書き込みは自動改行されません。適度に改行を入れてください。
  4. スクリプトは小文字の<pre>〜</pre>で囲むと見やすく表示できます。

削除用パスワード

解決したら質問者本人がここをチェックしてください。

エラー発生時、再送信すると二重送信になることがあります。
回答が得られたら、お礼書き込み時に[解決]チェックしてください。
SPAM防止のためURLから始まる文章は投稿できません。
SPAM防止のため英文字のみの本文を投稿することはできません。

ONION software Copyright 1997-2021(c) All rights reserved.