为什么我们不能从浮点最大值中减去?

Jér*_*ton 4 c++ floating-point

几天前,我试图减去10000 std::numeric_limits<float>::max(),我只是发现价值根本没有变化,无论我减去什么价值.事实上,似乎所有浮点类型都有这种行为.

例如(在g ++和msvc上),这个没有通过(好):

int i = std::numeric_limits<int>::max();
assert(i == i - 10000); // Doesn't pass
Run Code Online (Sandbox Code Playgroud)

但是这个(?):

float f = std::numeric_limits<float>::max();
assert(f == f - 10000.f); // Pass
Run Code Online (Sandbox Code Playgroud)

我甚至试图直接分配最大值(在这种情况下为3.40282e + 38),但它似乎没有改变任何东西.此外,它似乎与任何足够高的值完全相同.有人可以向我解释为什么会这样做吗?谢谢.

Pho*_*reo 6

浮点数不是很精确int.你减去的数量太小,无法在有效数字上产生差异,只会在精度上迷失.std::numeric_limits<float>::max()非常大(3.402823e + 38).

如果你这样做:

float f = std::numeric_limits<float>::max();
assert(f == f - f/2.f);
Run Code Online (Sandbox Code Playgroud)

我相信它会失败.