5

加算演算が double をアンダーフローするかどうかを判断するコードをデバッグしているときに、少なくとも自分の頭の中で奇妙な動作に遭遇しました。これは、私が見つけたものを示すサンプルプログラムです。

#include <iostream>
#include <limits>

using std::cout;
using std::endl;
using std::numeric_limits;

int main()
{
    double lowest = numeric_limits<double>::lowest();
    bool truth = (lowest + 10000) == lowest;
    cout << truth << endl;
}

このコードを実行すると、結果として true になります。これはバグですか、それとも睡眠不足ですか?

4

1 に答える 1

15

最小の double は次のとおりです。

-1.7976931348623157e+308

これに 10,000 または 1e4 を追加しても、double が 300 桁以上の精度を持つ場合にのみ顕著な効果がありますが、これは間違いなくありません。double は 15 ~ 17 桁の有効数字しか保持できません。

これら 2 つの数の大きさの違いは非常に大きいため、10,000 を追加しても新しい数は生成されません。実際、最小の double は(いわば) 非常に大きな数であるため、これにグーゴル( 1 の後に 100 個のゼロが続く) を追加しても変化しません。

于 2014-09-11T05:21:49.310 に答える