Я использую Visual C ++ 6.0 в Windows XP.Мой код выглядит следующим образом:
# 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.
1/(65536*65536)
0.00000000023283064365386962890625
Спасибо за вашу помощь!
Целочисленное переполнение. Вы можете просто привести int к удвоению, прежде чем умножить:
sum=1.0/(((double)n)*n);
Вместо приведения вы можете просто сделать это:
double result = 1.0/n/n;
hth
Предполагается, что у вас 32-битные целые числа n * n вызывает переполнение (4294311936).Целое число варьируется от
–2,147,483,648 to +2,147,483,647
Вы можете попытаться объявить n как double n = 65536;
double n = 65536;
n * n слишком велико для целого числа. сделай это вдвойне.
Заменить сумму = 1,0 / (n * n);по сумме = 1,0 / (двойной) n / (двойной) n;причина - целочисленное переполнение (32 бита), за которым следует отсутствие приведения (вторичного).
Не уверен насчет двойных звездочек **, но вам нужно использовать тип long или long long для хранения целых чисел этого размера.
**
long
long long
Кажется, что умножение двух int переменных переполняется, потому что 65536 * 65536 не вписывается в 32 бита.Попробуйте использовать long long или double для m и n.
int
double
m
n