我正在学习c语言,当我的代码应该是错误的时候,我的代码似乎将(1e16-1>=1e16)评估为真时,我感到困惑。我的代码在下面,它返回
9999999999999999 INVALIDBIG\n
当我希望它不会归还任何东西的时候。我认为使用long long可以避免任何与大数有关的问题。
int main(void)
{
long long z;
z = 9999999999999999;
if ( z >= 1e16 || z < 0 )
{
printf("%lli INVALIDBIG\n",z);
}
}
最佳答案
1e16是一个双精度文本值,浮点/双精度对于十进制算术/比较来说可能不精确(只是许多常见示例中的一个:十进制0.2)。它将把长z向上转换为double进行比较,我猜标准的double表示不能存储所需的精度(也许其他人可以演示二进制尾数/符号表示)
尝试将1e16更改为(长双精度)1e16,它不会打印出您的消息。(更新:或者,正如另一个问题注释者添加的那样,将1e16更改为整数文本)