C ++: проблема с простым уравнением? - PullRequest
0 голосов
/ 18 ноября 2010

Я использую 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.

Спасибо за вашу помощь!

Ответы [ 7 ]

5 голосов
/ 18 ноября 2010

Целочисленное переполнение. Вы можете просто привести int к удвоению, прежде чем умножить:

sum=1.0/(((double)n)*n);
1 голос
/ 18 ноября 2010

Вместо приведения вы можете просто сделать это:

double result = 1.0/n/n;

hth

1 голос
/ 18 ноября 2010

Предполагается, что у вас 32-битные целые числа n * n вызывает переполнение (4294311936).Целое число варьируется от

–2,147,483,648 to +2,147,483,647  

Вы можете попытаться объявить n как double n = 65536;

1 голос
/ 18 ноября 2010

n * n слишком велико для целого числа. сделай это вдвойне.

0 голосов
/ 13 декабря 2010

Заменить сумму = 1,0 / (n * n);по сумме = 1,0 / (двойной) n / (двойной) n;причина - целочисленное переполнение (32 бита), за которым следует отсутствие приведения (вторичного).

0 голосов
/ 18 ноября 2010

Не уверен насчет двойных звездочек **, но вам нужно использовать тип long или long long для хранения целых чисел этого размера.

0 голосов
/ 18 ноября 2010

Кажется, что умножение двух int переменных переполняется, потому что 65536 * 65536 не вписывается в 32 бита.Попробуйте использовать long long или double для m и n.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...