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
我无法弄清楚为什么(它应该是一个积极的结果)。 有人可以帮忙吗?
答案 0 :(得分:3)
也许您必须将这些常量指定为“long long”文字?例如3289168178315264LL
答案 1 :(得分:1)
您使用的是哪种编译器/操作系统?我在Windows XP和IT WORKS上使用Visual C ++ 2008 Express Edition运行代码 - 回答:6578336356630528(这是一个53位数字,因此它只适合双倍内容)。
我还尝试了两种变体,看看操作顺序是否重要:
long long int out = A; 出+ = B * d;
long long int out = B * D; 出+ = A;
这两者都有效!
好奇。
答案 2 :(得分:0)
我的猜测是编译器需要先将结果从“A + B * D”舍入到整数,因为您将结果存储在int字段中。所以基本上,你的数据类型存在冲突。
A和B都是长long int的有效数字,长度为8个字节。您甚至可以将它们乘以1.000并且仍然具有有效的long long int值。在其他一些语言中,它也被称为int64。
然而,double也是64位,但其中一部分用作指数。将double与int64相乘时,结果将是另一个double。添加另一个int64仍然使它保持双倍。然后,您将结果再次分配给int64,而不使用特定的舍入方法。如果编译器为此使用4位舍入函数,我不会感到惊讶。甚至惊讶于编译器不会在该声明中嗤之以鼻!
无论如何,当使用这样的大数字时,在混合不同类型时你必须格外小心。
答案 3 :(得分:0)
你的答案(必须验证)成功计算,然而,它会导致符号位溢出,这使得答案为负。解决方案:使所有变量都无符号。
为什么:
数字以计算机内存中的一系列位存储。这一系列中的第一位,设置时表示您的数字为负数。所以计算有效,但溢出到符号位。
建议:
如果您正在处理这么大的数字,我建议您使用多精度算术库。 “这将为您节省大量时间和麻烦。
答案 4 :(得分:-1)
sqrt的参数应为 double 。
#include <math.h>
double sqrt( double num );
而且我们也应该把B * D的结果展示给长期。
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);