c中的不等式不起作用

c中的不等式不起作用,c,inequality,C,Inequality,我正在学习c语言,我感到很困惑,因为我的代码在应该为false的情况下(1e16-1>=1e16)的计算结果似乎为true。我的代码在下面,它返回 9999999999999999 INVALIDBIG\n 当我希望它不会归还任何东西的时候。我认为使用long-long可以避免任何大数字的问题 int main(void) { long long z; z = 9999999999999999; if ( z >= 1e16 || z < 0 )

我正在学习c语言,我感到很困惑,因为我的代码在应该为false的情况下(1e16-1>=1e16)的计算结果似乎为true。我的代码在下面,它返回

9999999999999999 INVALIDBIG\n
当我希望它不会归还任何东西的时候。我认为使用long-long可以避免任何大数字的问题

int main(void)
{
    long long z;

    z = 9999999999999999;

    if ( z >= 1e16 || z < 0 )
    {
        printf("%lli INVALIDBIG\n",z);
    }
}
int main(无效)
{
长z;
z=9999999999;
如果(z>=1e16 | | z<0)
{
printf(“%lli INVALIDBIG\n”,z);
}
}

1e16是一个双精度文本值,浮点数/双精度对于十进制算术/比较来说可能不精确(这只是许多常见示例中的一个:十进制0.2)。它会将长z向上转换为双精度来进行比较,我猜标准的双精度表示法无法存储所需的精度(也许其他人可以演示二进制尾数/符号表示法)


尝试将1e16更改为(长双精度)1e16,这样不会打印您的邮件。(更新:或者,正如另一位问题评论员所添加的,将1e16更改为整数文字)

1e16是双精度文字值,浮点数/双精度对于十进制算术/比较可能不精确(只是许多常见示例中的一个:十进制0.2)。它会将长z向上转换为双精度来进行比较,我猜标准的双精度表示法无法存储所需的精度(也许其他人可以演示二进制尾数/符号表示法)


尝试将1e16更改为(长双精度)1e16,这样不会打印您的邮件。(更新:或者,正如另一位问题评论员所添加的,将1e16更改为整数文字)

双精度和浮点值可以容纳有限的位数。在您的情况下,值为
9999999999999
1e16
的双精度数字具有相同的8字节十六进制表示。您可以逐字节检查它们:

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

/* prints 0 */
printf("memcmp: %d\n", memcmp(&dz1, &dz2, sizeof(double)));
所以,他们是平等的

较小的整数可以以双精度存储。例如,请参见或


可以精确转换为double的最大整数是253(
9007199254740992
)。

double和float可以容纳有限的位数。在您的情况下,值为
9999999999999
1e16
的双精度数字具有相同的8字节十六进制表示。您可以逐字节检查它们:

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

/* prints 0 */
printf("memcmp: %d\n", memcmp(&dz1, &dz2, sizeof(double)));
所以,他们是平等的

较小的整数可以以双精度存储。例如,请参见或


可以精确转换为双精度的最大整数是253(
9007199254740992
)。

无法复制。尝试
1e16LL
。更新:实际上指数表示法返回浮点类型,所以不能在其上附加整数后缀。你最好用整数constants@EugeneSh. <代码>浮点或
双精度
?@SouravGhosh浮点。确切的类型在这里并不重要,我相信..我投票结束这个问题,因为FP,比较,我不想费心去查找DUP。谢谢大家的帮助!我想我知道这里发生了什么,无法复制。尝试
1e16LL
。更新:实际上指数表示法返回浮点类型,所以不能在其上附加整数后缀。你最好用整数constants@EugeneSh. <代码>浮点或
双精度
?@SouravGhosh浮点。确切的类型在这里并不重要,我相信..我投票结束这个问题,因为FP,比较,我不想费心去查找DUP。谢谢大家的帮助!我想我知道现在这里发生了什么。