几天前,我试图从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),但它似乎没有改变任何东西。此外,它似乎对任何足够高的值都做同样的事情。有人能向我解释为什么会这样吗?谢谢。
浮点数不像int
那样精确。你减去的量太小了,不足以产生意义上的差异,它只是在精度上丢失了。std::numeric_limits
如果您这样做:
float f = std::numeric_limits<float>::max();
assert(f == f - f/2.f);
我肯定它会失败的。
与最大浮点数相比,1000.0是如此之小,以至于值被舍入到std::numeric_limits
查看另一个答案中的示例(浮点数学是否已损坏?)以获取更多详细信息。