C код экспоненциального вычисления дает неверный результат - PullRequest
0 голосов
/ 09 июля 2020

для значения типа int 2,015,671 этот код выводит 475,739,751

long long cube(int n)
{
return n*n*n;
}

Хотя правильное значение должно быть 8,189,529,329,933,957,120 , но с использованием pow (n, 3) от Я получил правильный результат. Если это переполнение типа long long, то почему это работает для pow ? И он не достигает максимального значения для длинного типа данных 9,223,372,036,854,775,807 . Чем объясняется такое поведение?

Ответы [ 2 ]

6 голосов
/ 09 июля 2020

Преобразование результата выражения в новый тип происходит слишком поздно.

Если n - это int, то n*n*n - это выражение, включающее только int s, и выдает int результат (некоторые тонкие неявные преобразования существуют для типов меньше, чем int, но это не главная проблема здесь).

Если этот результат выходит за пределы, то его размещение в более широком целом числе не поможет восстановить потерянные информации.
Вам необходимо выполнить это преобразование до вычисления выражения.

long long cube(int n)
{
long long r=n;
return r*r*r;
}

(или измените параметр на long long)

1 голос
/ 09 июля 2020

Вы должны явно преобразовать int в long long int.

long long cube(int n) {
  return (long long int) n*n*n;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...