ダブル型のインクリメント
- purin52002
- 記事: 235
- 登録日時: 7年前
- 連絡を取る:
Re: ダブル型のインクリメント
http://dixq.net/forum/viewtopic.php?f=3&t=9447
検索かけたら出てきました^p^
検索かけたら出てきました^p^
c++初心者を自負しています。
質問者さんには今後私にプログラミングを教えてくれるようにやさしく丁寧に教えるつもりです。ぎぶあんどていく^p^
回答者さんには精一杯感謝します。ぎぶおんりー^p^
質問者さんには今後私にプログラミングを教えてくれるようにやさしく丁寧に教えるつもりです。ぎぶあんどていく^p^
回答者さんには精一杯感謝します。ぎぶおんりー^p^
Re: ダブル型のインクリメント
int でも、double でも正しくインクリメントできない場合があります。
実行結果
浮動小数点数の計算で最も広く採用されている標準規格は、IEEE 754 です。
符号 1ビット、指数 11ビット、仮数 52ビットですが、正規化した時の
最上位ビットの 1を省略しているので、精度は 2進 53ビットです。
10進では約16桁。なぜ約かというと、53ビットでは、2の 53乗で
9007199254740992通りの値を正確に表せます。整数で言えば、
0~9007199254740991 です。
0~9999999999999999 なら本当に 10進16桁の精度と言えますが、
ちょっと足りないですね。
54ビットの 9007199254740992 は偶数で、最下位ビットが 0 ですから、
上位 53ビットだけを記憶できればよく、これも OK です。
しかし、9007199254740993 は奇数で、最下位ビットが 1 ですから、
54ビットを必要とし、IEEE 754 では表現できません。
#include <stdio.h>
int main()
{
int i = 2147483644;
double d = 9007199254740989.0;
for (int k = 0; k < 5; k++) {
printf("%12d %.1f\n", ++i, ++d);
}
return 0;
}
2147483645 9007199254740990.0
2147483646 9007199254740991.0
2147483647 9007199254740992.0
-2147483648 9007199254740992.0
-2147483647 9007199254740992.0
符号 1ビット、指数 11ビット、仮数 52ビットですが、正規化した時の
最上位ビットの 1を省略しているので、精度は 2進 53ビットです。
10進では約16桁。なぜ約かというと、53ビットでは、2の 53乗で
9007199254740992通りの値を正確に表せます。整数で言えば、
0~9007199254740991 です。
0~9999999999999999 なら本当に 10進16桁の精度と言えますが、
ちょっと足りないですね。
54ビットの 9007199254740992 は偶数で、最下位ビットが 0 ですから、
上位 53ビットだけを記憶できればよく、これも OK です。
しかし、9007199254740993 は奇数で、最下位ビットが 1 ですから、
54ビットを必要とし、IEEE 754 では表現できません。