プロが教える店舗&オフィスのセキュリティ対策術

お世話になります。
Perlを使って、計算機には誤差があるという話をしようと思って、

 print "1/3*3=", 1/3*3, "\n";

というプログラムを実行させました。
自分としては、1/3の時点で0.333333333333的な数になるので、それを3倍すると、0.9999999999的な数字になると思いましたが、結果としては1になります。
これはどういう原理でしょうか。
よろしくお願いします。

A 回答 (1件)

浮動小数点だから、仮数部と指数部で表現できる数値表現のうち、もっとも近いものに丸められるからでは?



my $num1 = 1 / 3;
printf "%.64f\n", $num1;
#0.3333333333333333148296162562473909929394721984863281250000000000

my $num2 = $num1 * 3;
printf "%.64f\n", $num2;
#1.0000000000000000000000000000000000000000000000000000000000000000

http://perldoc.jp/docs/perl/5.10.0/perlnumber.pod
http://ja.wikipedia.org/wiki/%E6%B5%AE%E5%8B%95% …
    • good
    • 0
この回答へのお礼

ありがとうございます!
単純に切捨てではなくて丸めているんですね。
あと、45.2-38.8 が 6.40000000000001 になるってのもあるんですねw
http://d.hatena.ne.jp/satakesatake/20090522/1242 …

お礼日時:2011/05/31 18:14

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!