• 締切
  • 暇なときにでも

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

  • 質問No.2876
  • 閲覧数56
  • ありがとう数6
  • 回答数2

お礼率 13% (21/151)

$value = <STDIN>;
chomp($value);
if ($value >= 5) {
print "5以上の数です。";
} else {
print "5よりも小さい数です。";
}


上のperlを実行した時に、4.999999999999999 9が15個並んだときは、5よりも小
さいのですが、16個以上の時は5以上になってしまいます。
これってどういうことですか。
教えてください。

回答 (全2件)

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

お礼率 13% (21/151)

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

お礼率 13% (21/151)

回答ありがとうございます。
4.999..... 9が16個以上ある場合は近似値として、つまり5.000...1としか扱えない。つまり、4.999....として扱うことはできない。ということでよろしいでしょうか。
投稿日時:0000/00/00 00:00
関連するQ&A

その他の関連するQ&Aをキーワードで探す

ピックアップ

ページ先頭へ