std::pow не возвращает ожидаемое значение int

Следующий код возвращает 99 в качестве вывода.

#include<iostream>
#include <math.h>
using namespace std;
int Solve(int a)
{
    return (pow(a,2));
}
int main()
{
    int a=10;
    cout<<Solve(a)<<endl;
    return 0;
}

Я понятия не имею, почему это происходит, и, более того, это происходит и с 5, и с 25, так что это как-то связано с числами, кратными 5.

P.S. компьютер сломался или что :D


person J.Doe    schedule 15.08.2015    source источник
comment
Пробовали ли вы какие-либо типы с плавающей запятой, для которых предназначен std::pow?   -  person WhozCraig    schedule 15.08.2015
comment
Это может зависеть от вашей системы. Для меня он возвращает 100. Возможно, в вашей системе он возвращает 99,99999998, который будет преобразован в 99 при приведении к int.   -  person vsz    schedule 15.08.2015


Ответы (1)


Технический аспект: std::pow не определен для int, только для double и float. Поэтому вы не можете полагаться на то, что он возвращает точное значение int. Вы должны ожидать ошибки округления.

Аспект алгоритма: Вычисление n-й степени с использованием наивного алгоритма (n умножений), очевидно, требует линейного времени. Чтобы повысить производительность при больших мощностях, в большинстве реализаций std::pow этот наивный алгоритм не используется. Вместо этого они вычисляют мощность с помощью логарифмов. Это гораздо быстрее, но не так правильно, как наивный подход.

Поэтому, если вам нужны точные результаты, вы должны рассчитать мощность, используя цикл for.

person Robin Krahl    schedule 15.08.2015
comment
Благодарю вас! Я использовал его в программе, где std::pow вызывался много раз подряд, и когда это произошло, это просто взорвало мне мозг. - person J.Doe; 15.08.2015
comment
@ J.Doe Я знаю, о чем вы говорите - у меня была std::pow, вызвавшая аналогичную проблему несколько месяцев назад, и я сходил с ума, пытаясь решить эту проблему. ;-) - person Robin Krahl; 15.08.2015