http://www.gotw.ca/gotw/067.htmに例があります
int main()
{
double x = 1e8;
//float x = 1e8;
while( x > 0 )
{
--x;
}
}
double を float に変更すると、VS2008 では無限ループになります。ゴウの説明によると:
float が 0 から 1e8 までのすべての整数値を正確に表現できない場合はどうなるでしょうか? その後、変更されたプログラムはカウントダウンを開始しますが、最終的には表現できない値 N に到達し、 N-1 == N (浮動小数点の精度が不十分なため) になります...そして、ループはスタックしたままになります。プログラムが実行されているマシンの電源がなくなるまで、その値で。
私が理解していることから、IEEE754 float は単精度 (32 ビット) であり、float の範囲は +/- 3.4e +/- 38 であり、有効桁数は 7 桁である必要があります。
しかし、私はまだこれがどのように起こるのか正確には理解していません. 誰かがこのビットを説明しようとすることができますか?
少し追加情報: double x = 1e8 を使用すると、約 1 秒で終了しました。float x = 1e8 に変更すると、はるかに長く実行されます (5 分後も実行されます) float x = 1e7;
。 1秒くらいで終わりました。
私のテスト環境は VS2008 です。
ところで、基本的な IEEE 754 形式の説明は、既に理解しているので質問していません。
ありがとう