long long int A = 3289168178315264;
long long int B = 1470960727228416;
double D = sqrt(5);
long long int out = A + B*D;
printf("%lld",out);
这给出了结果:-2147483648
我不知道为什么(这应该是一个积极的结果)。有人可以帮忙吗?
long long int A = 3289168178315264;
long long int B = 1470960727228416;
double D = sqrt(5);
long long int out = A + B*D;
printf("%lld",out);
这给出了结果:-2147483648
我不知道为什么(这应该是一个积极的结果)。有人可以帮忙吗?
也许您必须将这些常量指定为“long long”文字?例如3289168178315264LL
您使用的是什么编译器/操作系统?我在 Windows XP 和 IT WORKS 上使用 Visual C++ 2008 Express Edition 运行了您的代码 - 答案:6578336356630528(这是一个 53 位数字,所以它只适合双精度数)。
我还尝试了两种变体来查看操作顺序是否重要:
长长 int = A; 出+=B*D;
long long int out = B*D; 出+=A;
这两个也有效!
好奇的。
我的猜测是编译器需要首先将结果从“A+B*D”四舍五入为整数,因为您将结果存储在 int 字段中。所以基本上,你有一个数据类型冲突。
对于 8 字节长的 long long int,A 和 B 仍然是有效数字。您甚至可以将它们乘以 1.000 并且仍然具有有效的 long long int 值。在其他一些语言中,它也称为 int64。
然而,双精度也是 64 位,但其中一部分用作指数。当您将双精度数与 int64 相乘时,结果将是另一个双精度数。向其中添加另一个 int64 仍然保持双倍。然后,您再次将结果分配给 int64 而不使用特定的舍入方法。如果编译器为此使用 4 位舍入函数,我不会感到惊讶。我什至惊讶于编译器不会在该语句上呕吐和中断!
无论如何,当使用像这样的大数字时,在混合不同类型时必须格外小心。
您的答案(必须验证)计算成功,但是,它会导致符号位溢出,这使得答案是否定的。解决方案:使所有变量无符号。
为什么:
数字作为一系列位存储在计算机的内存中。这样一个系列中的第一位,当设置时意味着你的数字是负数。所以计算有效,但溢出到符号位。
推荐:
如果您正在处理这么大的数字,我建议您获取一个多精度算术库。'T 将为您节省大量时间和麻烦。
sqrt 的参数应该是double。
#include <math.h>
double sqrt( double num );
我们还应该将 B * D 的结果显式转换为 long long。
long long int A = 3289168178315264;
long long int B = 1470960727228416;
double D = sqrt(5.0);
printf("%f\n",D);
long long int out = A + (long long) (B * D);
printf("%lld",out);