藤岡和夫さんの[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:$
--