c++ - 从什么数字开始,以下转换整数 -> double -> 整数无效?

标签 c++ integer double floating-accuracy floating-point-precision

假设我的计算机使用 IEEE 754 浮点编码,我想知道以下函数返回 false 的最小数字是多少:

constexpr bool test(const unsigned long long int x)
{
    return static_cast<unsigned long long int>(static_cast<double>(x)) == x;
}

最佳答案

double 上的尾数在 IEEE-754 中是 53 位(52 位和一个隐藏的,非常技术性)。这意味着如果 x 中的最高位高于 bit 52,并且一些低位非零,比较将失败。

您可以通过编写一段代码找到这一点:

unsigned long long x = 0x1;

while(x > 0)
{
   x <<= 1ULL;
   if (!test(x+1))
   {
      cout << "x=" << hex << x << endl;
      break;

   }
}

编辑:在实际测试后稍微修正了代码。

它打印 x=20000000000000正如预测的那样。

或者,如果您想使用 <limits> ,您可以通过以下方式获得相同的结果:

numeric_limits<double> n;
cout << "digits=" << dec << n.digits << " -> " << hex << (1ULL << n.digits) << endl;

关于c++ - 从什么数字开始,以下转换整数 -> double -> 整数无效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16171850/

相关文章:

javascript - 输入模型在更改时从 Integer 更改为 String

c++ - mmap 没有按预期工作(返回随机 0xdeadbeef)

c++ - 如何在组合框中发送这些项目

c++ - 如何将 type 和 mpl::vector 连接到一个新的 vector 中

c++ - vector<int> 中的 std::sort 返回 0 而不是值

java - 如何在 Java 中将整数的字符串表示形式转换为字符串?

c# - 字符串和数字条件的最佳实践

c++ - ASM 中的 float

dart - 如何设置Dart小数点后的最小位数?

performance - 为什么 CUDA 浮点程序在全速 FP64 模式下变得更快?