作者: dune
日時: 2005/10/09(00:31)
藤岡和夫さんの[TSperl:605] Re: INT関数の使い方についてから
> 結局、Perlクックブックのレシピ2.3「浮動小数点数を比較する」では、
>sprintfを使って、ある桁数に丸めて比較するということになります。通常のコ
>ンピュータハードウェアでは、15桁程度の精度しかないので、それ以上の桁数で
>比較しても意味がないということらしい(なぜだろう?)。

log(999999999999999)/log(2) ≒ 50 なので、浮動小数点を表している
小数部分は 50 bit くらいだって言ってるのだと思う。

bigrat を使うのも、おもしろいです。

[スクリプト]
use strict;
my $x = shift or die;
my $total = 0;
$total += 1 / $x foreach(1..$x);
print $total == 1 ? "ok" : "NG", "\n";
print 1 / $x, " x ", $x, " = ", $total, "\n"; 

[実行結果]
[]
D:$ perl          gomi.pl 10
NG
0.1 x 10 = 1

D:$ perl -Mbigrat gomi.pl 10
ok
1/10 x 10 = 1

D:$ perl          gomi.pl 3
ok
0.333333333333333 x 3 = 1

D:$ perl -Mbigrat gomi.pl 3
ok
1/3 x 3 = 1

D:$
--