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

沢渡 さま

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



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