私はこのコードサンプルを持っています:
float approx = 1234567712f;
System.out.println(approx);
「1.234567712E9」または同様のものを印刷する代わりに、「1.23456768E9」を印刷します。私が理解しているように、これはバイナリレベルでの精度と関係があります。
浮動小数点数 (コンマ (",") 記号の前後) の精度は 2 進数で何桁ですか? なぜこのようなことが起こるのか、簡単に説明できますか?
私はこのコードサンプルを持っています:
float approx = 1234567712f;
System.out.println(approx);
「1.234567712E9」または同様のものを印刷する代わりに、「1.23456768E9」を印刷します。私が理解しているように、これはバイナリレベルでの精度と関係があります。
浮動小数点数 (コンマ (",") 記号の前後) の精度は 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
あなたが見た数字です。
float の精度は、コンマの前後で最大 7 桁です。そのため、1234567 は正しく、他の 3 桁は正しくありません。高い数値で計算したい場合は、float の代わりに double を使用する必要があります