假设我的计算机使用 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/