OKWAVEのAI「あい」が美容・健康の悩みに最適な回答をご提案!
-PR-
締切り
済み

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

  • 暇なときにでも
  • 質問No.2876
  • 閲覧数42
  • ありがとう数6
  • 気になる数0
  • 回答数2
  • コメント数0

お礼率 13% (21/151)

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


上のperlを実行した時に、4.999999999999999 9が15個並んだときは、5よりも小
さいのですが、16個以上の時は5以上になってしまいます。
これってどういうことですか。
教えてください。
通報する
  • 回答数2
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

回答 (全2件)

  • 回答No.1

Perlでは、数値は整数も小数も内部的には全て 倍精度浮動小数点として持っています。 つまり、8バイト(64ビット)で、数値を表現しなければなりません。 この場合、有効桁数は15~16桁になります。 表現するために要するビット数が有限ですから、当然それ以上の桁数を 指定すると誤差が生じ、近似値としてしか表現できないことになります。 4.999.... としても、誤差によって 5.000... ...続きを読む
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:00
  • 回答No.2

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

お礼率 13% (21/151)

なるほど。ありがとうございました。
投稿日時 - 0000-00-00 00:00:00
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

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

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ