提问者:小点点

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


几天前,我试图从std::减去10000numeric_limits

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

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

但是这个有(?):

float f = std::numeric_limits<float>::max();
assert(f == f - 10000.f); // Pass

我甚至尝试直接分配最大值(在本例中为3.40282e 38),但它似乎没有改变任何东西。此外,它似乎对任何足够高的值都做同样的事情。有人能向我解释为什么会这样吗?谢谢。


共2个答案

匿名用户

浮点数不像int那样精确。你减去的量太小了,不足以产生意义上的差异,它只是在精度上丢失了。std::numeric_limits

如果您这样做:

float f = std::numeric_limits<float>::max();
assert(f == f - f/2.f);

我肯定它会失败的。

匿名用户

与最大浮点数相比,1000.0是如此之小,以至于值被舍入到std::numeric_limits

查看另一个答案中的示例(浮点数学是否已损坏?)以获取更多详细信息。