teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

追記

2016/07/09 17:21

投稿

Chironian
Chironian

スコア23274

answer CHANGED
@@ -5,3 +5,6 @@
5
5
  DBL_MAXは 1.11111...(52ビット) * 2^1023 です。
6
6
  小数点直下から52ビット連続の1を1023ビット左シフトした値なので、結果は小数点の上に1023-52=971ビットの0が続きます。
7
7
  その値から、高々123456789.0を引いても、小数点の上971ビット目は1ですので切り上られて元に戻ってしまいます。
8
+
9
+ 小さな10進数の値で考えると分かりやすいです。
10
+ 50,000から100引くと49,900となります。この1,000の桁を四捨五入したら50,000に戻るという現象です。

1

typo

2016/07/09 17:21

投稿

Chironian
Chironian

スコア23274

answer CHANGED
@@ -3,5 +3,5 @@
3
3
  単純に桁落ちです。
4
4
  doubleの指数部は11ビットで、仮数部が52ビットです。
5
5
  DBL_MAXは 1.11111...(52ビット) * 2^1023 です。
6
- 52ビットを1023ビット左シフトすることにので、小数点の上に1023-52=971ビットの0が続きます。
6
+ 小数点直下から52ビット連続の1を1023ビット左シフトした値なので、結果は小数点の上に1023-52=971ビットの0が続きます。
7
- その値から、高々123456789.0を引いても、小数点の上971ビット目を四捨五入ので切り上られて元に戻ってしまいます。
7
+ その値から、高々123456789.0を引いても、小数点の上971ビット目は1ですので切り上られて元に戻ってしまいます。