javaで0.05を二乗した値が0.002500000005になりました。

Java26閲覧

ベストアンサー

0

ThanksImg質問者からのお礼コメント

解決法まで提示していただいてありがとうございます。

お礼日時:4/19 21:27

その他の回答(3件)

0

なんででしょうか? ==>言語仕様です。 C言語で小数点以下を30桁まで表示させたら、、、、 0.002500000000000000485722573274 となりました。 計算速度を上げる為に言語仕様で2進数に変換してから演算しているのが原因です。 0.05は、2進数にすると、0.00001100...(1100の循環小数)になります。

0

計算機で浮動小数点数の演算を行うときは正確な値は期待できません。プログラマならIEEE754は知っていて損はないです。 まず"0.05"を浮動小数点数に変換する際に偶数まるめが行われます。その値を二乗した場合にも偶数まるめが行われます。 そんな関係で多少の誤差には目をつむらないといけません。

0

コンピュータは、数値を2進数で扱っていますが、 整数はともかく、少数は10進数と2進数では、割り切れる数が違う為、 少数を正確に表現することができません。 その為、少数の計算には誤差が生まれます。 (それを防ぐ為にはdouble等の浮動小数点数を使わずに整数を使って固定小数点数で計算する必要があります。) 2進数は、2倍になると桁が上がる、 逆に言うと桁が下がると半分になります。 つまり、2進数で、0.1 は、1の半分なので、 10進数で書くと1の半分の0.5になります。 同様に、 0.01 = 0.25 0.001 = 0.125 0.0001 = 0.0625 とすごく半端な数になってゆきます。 それを組み合わせて少数を作るので、 10進数の0.1は割り切れずに、 0.0001100110011001100110011001100110011001100110011001101… という数値になります。 もちろん、コンピュータが扱える桁数には限界がある為、ある程度の桁数で端数が丸められます。 結果、10進数の0.1は、コンピュータ上では正確な0.1ではなくなってしまいます。 (0.099999964237213134765625とかになります。) それをもとに計算を行うと、誤差が生じます。 場合によっては問題なくらい誤差が大きくなるので注意が必要です。