昼休みに、double
値型の精度について議論を始めました。
私の同僚は、小数点以下は常に 15 桁だと考えています。
1
私の意見では、IEEE 754 はこれについて仮定を行っておらず、バイナリ表現の最初の位置に依存するため、わかりません。(つまり、小数点の前の数値のサイズもカウントされます)
どうすればより適切なステートメントを作成できますか?
C# リファレンスで述べられているように、精度は小数点の前後で 15 ~ 16 桁です (表される 10 進数値によって異なります)。
要するに、あなたは正しいです、それは小数点の前後の値に依存します。
例えば:
12345678.1234567D
//右隣の桁は切り上げ1234567.12345678D
//右隣の桁は切り上げ完全なサンプル: http://ideone.com/eXvz3
また、値を固定小数点値として考えようとするdouble
のは得策ではありません。
あなたは両方とも間違っています。法線の精度double
は 53ビットです。これはおおよそ 10 進数の 16 桁に相当しますが、double
値を小数であるかのように考えることは混乱を招くので、避けるのが最善です。
とはいえ、あなたは同僚よりもはるかに正確です。精度は、表現されている値に関連しています。十分に大きなdouble
s には、小数桁の精度がありません。
たとえば、 より大きい次の double4503599627370496.0
は です4503599627370497.0
。
C# double は IEEE 754 に従って、53 ビット仮数p (または仮数) と 11 ビット指数eで表され、-1022 ~ 1023 の範囲になります。したがって、それらの値は次のようになります。
p * 2^e
仮数は常に小数点の前に 1 桁あるため、小数部分の精度は固定されています。一方、double の小数点以下の桁数は、その指数にも依存します。指数が仮数の小数部の桁数を超える数には、小数部自体がありません。
すべてのコンピュータ科学者が浮動小数点演算について知っておくべきことは、おそらくこの主題に関する最も広く認知されている出版物です。