- 締切済み
数値に関しての質問です。
$value = <STDIN>; chomp($value); if ($value >= 5) { print "5以上の数です。"; } else { print "5よりも小さい数です。"; } 上のperlを実行した時に、4.999999999999999 9が15個並んだときは、5よりも小 さいのですが、16個以上の時は5以上になってしまいます。 これってどういうことですか。 教えてください。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
補足に対する回答です。 「9が16個」というのが問題ではなく、 数値として、有効桁が15桁を超えるときは、 その数値が正しく表現できないということです。 今回はたまたま繰り上がりのギリギリの値ですが、 1.2345678901234567890 という数値も、有効桁数が多いので正しく表現できず、 後ろのほうの数がちょっと狂ってしまいます。
Perlでは、数値は整数も小数も内部的には全て 倍精度浮動小数点として持っています。 つまり、8バイト(64ビット)で、数値を表現しなければなりません。 この場合、有効桁数は15~16桁になります。 表現するために要するビット数が有限ですから、当然それ以上の桁数を 指定すると誤差が生じ、近似値としてしか表現できないことになります。 4.999.... としても、誤差によって 5.000....1という数に近似されてしまうのです。 これはPerlに限ったことではなく、コンピュータで小数を表現するときは、 たいていこの浮動小数点の考え方が絡んできますので、覚えておいてください。
補足
回答ありがとうございます。 4.999..... 9が16個以上ある場合は近似値として、つまり5.000...1としか扱えない。つまり、4.999....として扱うことはできない。ということでよろしいでしょうか。
補足
なるほど。ありがとうございました。