为什么我们不能从浮点最大值中减去?
Why can't we subtract from floating point maximum values?
几天前,我试图从 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),但似乎并没有改变任何内容。同样,它似乎在任何足够高的值的情况下完成了完全相同的事情。有人可以向我解释为什么这样做?谢谢。
浮点数不像int
那样精确。您减去的数量太小了,无法在显着范围内产生影响,并且精确地损失了。std::numeric_limits<float>::max()
是疯狂的(3.402823e 38)。
如果您这样做:
float f = std::numeric_limits<float>::max();
assert(f == f - f/2.f);
我确定它会失败。
您正在击中IEEE_754浮点表示的限制。与最大浮点数相比,10000.0是如此之小,以至于该值被舍入 std::numeric_limits<float>::max()
检查其他答案中的示例(浮点数学损坏吗?)以获取其他细节。
相关文章:
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- 使用指针从C++中的数组中获取最大值
- 如何将这个C++哈希表转换为动态扩展和收缩,而不是使用硬设置的最大值
- 如何创建一个函数来计算并返回平均值、最大值和最小值
- 在二维数组中查找最小值和最大值?
- 整数溢出,最大值为 pow(10,19)
- 以C++递归方式查找向量中的最大值
- C++ - 如何在结构向量中找到结构体一个成员的最大值?
- 查找数组中第一个最小值和最后一个最大值元素之间的算术平均值
- C++ 函数,用于查找传入的 N 个数字的平均值、总和、最小值和最大值
- 我的 If Else 语句无法在向量 (C++) 中提供最大值
- 如何使用可变参数模板类使用模板元编程获得最大值
- C++不同的最小最大值实现
- Vec3b:r/g/b 颜色的最大值为 254,而不是 255
- CUDA - 将 float3 数组的 (x,y,z) 分量的最小值/最大值分开?
- 是否可以将无符号 int 的最大值转换为 int 并将结果转换为 -1?
- 查找包含 N 个元素的数组的最小值和最大值
- 井字游戏具有奇怪行为的最小最大值算法(C++)
- 错误C++在Visual Studio 2019中使用numeric_limits的长双精度最小值/最大值
- 为什么我们不能从浮点最大值中减去?