c不平等不起作用

时间:2015-10-14 15:29:47

标签: c inequality

我正在学习c,并且因为我的代码似乎在评估(1e16 - 1> = 1e16)时它很困惑,因为它应该是假的。我的代码在下面,它返回

//jComboBox1 = new javax.swing.JComboBox();

当我希望它不会返回任何东西时。我认为使用long long可以避免任何大数问题。

jComboBox1.setModel(new javax.swing.DefaultComboBoxModel(list1.toArray()));

2 个答案:

答案 0 :(得分:3)

1e16是双重类型的文字值,浮点数/双精度数对于十进制算术/比较来说可能是不精确的(只是众多常见例子中的一个:十进制0.2)。为了进行比较,它会将长长的z向上投射加倍,我猜测标准的双重表示不能存储所需的精度(也许其他人可以演示二进制尾数/符号表示)< / p>

尝试将1e16更改为(长双倍)1e16,它不会打印出您的消息。 (更新:或者,正如另一个问题评论者所添加的,将1e16更改为整数文字)

答案 1 :(得分:1)

双打和浮点数可以包含有限的数字。在您的情况下,值为99999999999999991e16的双数字具有相同的8字节十六进制表示。您可以逐字节检查它们:

long long z = 9999999999999999;
double dz1 = z;
double dz2 = 1e16;

/* prints 0 */
printf("memcmp: %d\n", memcmp(&dz1, &dz2, sizeof(double)));

所以,他们是平等的。

较小的整数可以以完美的精度存储在double中。例如,请参阅Double-precision floating-point formatbiggest integer that can be stored in a double

可以转换为双精度的最大整数是2 53 9007199254740992)。