回答編集履歴

2 追記

Chironian

Chironian score 20632

2016/07/10 02:21  投稿

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

Chironian

Chironian score 20632

2016/07/10 02:18  投稿

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

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る