• 締切済み

数値に関しての質問です。

$value = <STDIN>; chomp($value); if ($value >= 5) { print "5以上の数です。"; } else { print "5よりも小さい数です。"; } 上のperlを実行した時に、4.999999999999999 9が15個並んだときは、5よりも小 さいのですが、16個以上の時は5以上になってしまいます。 これってどういうことですか。 教えてください。

みんなの回答

noname#151056
noname#151056
回答No.2

補足に対する回答です。 「9が16個」というのが問題ではなく、 数値として、有効桁が15桁を超えるときは、 その数値が正しく表現できないということです。 今回はたまたま繰り上がりのギリギリの値ですが、 1.2345678901234567890 という数値も、有効桁数が多いので正しく表現できず、 後ろのほうの数がちょっと狂ってしまいます。

mune
質問者

補足

なるほど。ありがとうございました。

noname#151056
noname#151056
回答No.1

Perlでは、数値は整数も小数も内部的には全て 倍精度浮動小数点として持っています。 つまり、8バイト(64ビット)で、数値を表現しなければなりません。 この場合、有効桁数は15~16桁になります。 表現するために要するビット数が有限ですから、当然それ以上の桁数を 指定すると誤差が生じ、近似値としてしか表現できないことになります。 4.999.... としても、誤差によって 5.000....1という数に近似されてしまうのです。 これはPerlに限ったことではなく、コンピュータで小数を表現するときは、 たいていこの浮動小数点の考え方が絡んできますので、覚えておいてください。

mune
質問者

補足

回答ありがとうございます。 4.999..... 9が16個以上ある場合は近似値として、つまり5.000...1としか扱えない。つまり、4.999....として扱うことはできない。ということでよろしいでしょうか。

関連するQ&A