几天前,我试图从 std::numeric_limits<float>::max()
中减去 10000而且我发现无论我减去什么值,该值都没有改变。事实上,似乎所有浮点类型都有这种行为。
例如(在 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),但它似乎并没有改变任何东西。此外,它似乎对任何足够高的值都做同样的事情。有人可以向我解释为什么这样做吗?谢谢。
最佳答案
float 不像 int
那样精确.您减去的金额太小,无法对 significand 产生影响。它只是迷失在精度中。 std::numeric_limits<float>::max()
非常大 (3.402823e+38)。
如果你这样做:
float f = std::numeric_limits<float>::max();
assert(f == f - f/2.f);
我确定它会失败。
关于c++ - 为什么我们不能从浮点最大值中减去?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47424945/