2

私はこのコードサンプルを持っています:

float approx = 1234567712f;
System.out.println(approx);

「1.234567712E9」または同様のものを印刷する代わりに、「1.23456768E9」を印刷します。私が理解しているように、これはバイナリレベルでの精度と関係があります。

浮動小数点数 (コンマ (",") 記号の前後) の精度は 2 進数で何桁ですか? なぜこのようなことが起こるのか、簡単に説明できますか?

4

2 に答える 2

2

浮動小数点数は、「仮数」と「指数」で構成されます。最後の奇数桁までの整数を表すには、指数をゼロにする必要があります。これは、24 ビットが使用可能であることを意味し (24 番目のビットは常に 1 であるため、保存されません)、保存できる最大の整数は次のとおりです。

0xFFFFFF == 16777215

この数値に 2 を加算する場合、「正確な」表現は次のようになります。

0x1000001 = 16777217

この数値を格納するには 25 ビットが必要です。そのため、最後の桁が切り捨てられ、数値は次のように保存されます

0x800000 x 2^1 == 16777216

数値が大きくなるにつれて、連続する表現可能な数値間の「ジャンプ」が大きくなります。たどり着く頃には

1234567112 == 0x4995FFC8

保存するには32ビットが必要です。ただし、24ビットしかないため、次のように内部的に保存されます

0x499600 x 2^8  (rounded to the closest number).

= 0x49960000 = 1234567168

あなたが見た数字です。

于 2013-11-22T19:39:14.593 に答える
0

float の精度は、コンマの前後で最大 7 桁です。そのため、1234567 は正しく、他の 3 桁は正しくありません。高い数値で計算したい場合は、float の代わりに double を使用する必要があります

于 2013-11-22T19:30:28.467 に答える