我在Windows XP上使用Visual C ++ 6.0。我的代码如下:
# include "stdio.h"
void main () {
int m,n;
double sum=0;
n=65536;
sum=1.0/(n*n);
printf("%.20lf",sum);
return;
}
我的代码输出是:
1.#INF0000000000000000
为什么我得到错误答案?如何正确计算1/(65536*65536)
?我期待得到0.00000000023283064365386962890625
。
感谢您的帮助!
答案 0 :(得分:5)
有整数溢出。您可以在乘法之前将int转换为double:
sum=1.0/(((double)n)*n);
答案 1 :(得分:1)
n * n对于整数来说太大了。把它翻倍。
答案 2 :(得分:1)
假设你有32位整数n * n导致溢出(4294311936)。 整数范围从
–2,147,483,648 to +2,147,483,647
您可以尝试将n声明为double n = 65536;
答案 3 :(得分:1)
而不是投射你可以这样做:
double result = 1.0/n/n;
HTH
答案 4 :(得分:0)
似乎两个int
变量的乘法溢出,因为65536 * 65536不适合32位。尝试对long long
和double
使用m
或n
。
答案 5 :(得分:0)
不确定双星**
,但您需要使用long
或long long
类型来保存该大小的整数。
答案 6 :(得分:0)
替换 总和= 1.0 /(N * N); 通过 总和= 1.0 /(双)N /(双)n表示 原因是整数溢出(32位),然后是丢失的强制转换(辅助)。