numeric_limits中有错误吗?或者我只是感到困惑
Is there a bug in numeric_limits or am I just confused?
我在调试一些代码时遇到了一些奇怪的行为,至少在我自己看来是这样,这些代码涉及到确定加法操作是否会下溢double。下面是一个示例程序,演示我的发现。
#include <iostream>
#include <limits>
using std::cout;
using std::endl;
using std::numeric_limits;
int main()
{
double lowest = numeric_limits<double>::lowest();
bool truth = (lowest + 10000) == lowest;
cout << truth << endl;
}
当我执行这个代码时,结果是真的。这是虫子还是我睡眠不足?
最小的双精度是:
-1.7976931348623157e+308
只有当双打的精度达到300位数以上时,再加上10000或1e4才会产生明显的效果,而他们肯定不会这样做。双打只能容纳15-17位有效数字。
这两个数字的大小相差如此之大,加上10000并不能产生一个新的数字。事实上,最小二重是一个巨大的数字(可以这么说),你可以在它上面加一个googol——那是1后面跟着一百个零——它不会改变。
相关文章:
- 地图计数确实很重要,或者只是检查是否存在
- 错误 C2679:二进制"<<":未找到采用类型 'std::string_view' 的右侧操作数的运算符(或者没有可接受的转换)
- 为什么文件不是由 F 流创建的,或者即使它是输出只是垃圾值?
- C2678 二进制 '==':未找到采用 'Card' 类型左操作数的运算符(或者没有可接受的转换)
- 使用宏编译时使用用户定义的数学函数,或者仅使用 c++ 中标准数学库中的函数
- 如何仅使用一次固定<<设置精度(2)?或者至少恢复到默认行为?
- 我们应该如何使用枚举类进行索引(或者我们应该更好地避免这种情况)?
- GoogleTest 在使用 libgtest_main.a 时给出多个主定义,或者在不使用 libgtest_main
- 使用unique_ptr并返回引用,或者我应该使用shared_ptr并在需要时制作副本
- 我是否访问了已释放的内存,或者在这种情况下DrMemory报告不正确?
- C++类:virtual和override,或者两者都没有
- 二进制 '==':未找到采用 'Enemy' 类型左侧操作数的运算符(或者没有可接受的转换)
- <limits> 使用 VSC2019 编译旧代码时出错
- 在调用函数时,ptr** 和 ptr*& 之间是否有区别,或者首选C++?
- 这种比较是否不一致(或者存在其他问题)?
- 只需要知道我在c ++中打印模式的方式是否有效,或者有另一种方法可以有效地做到这一点
- 这是系统资源吗?(或者我怎么知道我是否需要删除指针) - 在 C++ 中使用 C
- 计时器坏了或者其他什么的
- 我的随机生成器是否不工作,或者我决定人/骨架是否击中对手的方式是否有错误
- 为什么C++数组索引值是有符号的,而不是围绕size_t类型构建的(或者我错了)