作者: KAWAI,Takanori
日時: 2005/10/10(16:51)
川合孝典です。

1/xについては結局のところどこかで切り捨てる必要があるので
その分の誤差が発生します。
で有効桁数の指定についてはbignumであれば、aで指定します。
#デフォルトは40

[スクリプト]
use strict;
use bignum a=> $ARGV[0];
my $iRes = 1/3;
print "$iRes\n";

[実行結果]
C:\temp>perl t1.pl 3
0.333

C:\temp>perl t1.pl 2
0.33

また大量の計算が必要になってスピードが気になる場合には
(実際にはMath::BigIntを利用しているので)
GMPやPARIなどの数値演算ライブラリを利用すると早くなります。
#とはいえテストでベンチマークはとったことはあるけど
#実感できるほどの大量の計算はあまりしたことないんですが

----- Original Message ----- 
From: "dune" <FZH01112@...>
To: <TSperl@...>
Sent: Sunday, October 09, 2005 12:31 AM
Subject: [TSperl:607] Re: INT関数の使い方について


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