从下面哪个数转换成整数->双→整数无效

From what number the following conversion integer -> double -> integer is not valid?

本文关键字:整数 无效 转换      更新时间:2023-10-16

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

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

IEEE-754中double上的尾数是53位(52位和一个隐藏的,非常技术性)。这意味着如果x中的最高位高于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;