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

标签 c++ floating-point

几天前,我试图从 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/

相关文章:

c++ - 强制枚举为无符号长类型

c++ - 如何加快将文本文件加载到多 vector

c# - 如何通过 DllImport 将 double 组从 C# 传递到 C++

c++ - opencv make error : limits. h 没有这样的目录文件

c - 如何以人类可读的形式将 double 写入文件并读回确切的 double?

C++工厂实现麻烦

algorithm - 圆浮点向量到整数向量

floating-point - SSE/AVX 浮点转换异常

python - Python 3 中的 int() vs float() 输入及其实用程序?

c - 硬 float 和软 float 有什么区别?