C:“(long long int)=(long long int)*(double)”的错误输出?

时间:2009-09-12 09:10:37

标签: c floating-point double overflow multiplication

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

我无法弄清楚为什么(它应该是一个积极的结果)。 有人可以帮忙吗?

5 个答案:

答案 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);