Как написать функцию pow() для обработки pow (2,48) без получения бесконечности (переполнения) в C ?

#c

#c

Вопрос:

 #include <iostream>

long double abs(long double num){
        if (num>=0)
                return num;
        else
                return -num;
}

long double pow(long double val, long double given_exp){

        long double res = val;
        long double exp = abs(given_exp);

        for (; exp > 1; exp--){
                res *= res;
        }

        if (given_exp > 0)
                return res;
        else
                return 1/res;
}

int main(){
        std::cout << pow(2, 1) << std::endl;
        std::cout << pow(2, -1) << std::endl;
        std::cout << pow(2, 48) << std::endl;
}
 

Это второе упражнение во 2-м издании Липпмана.
Прямо сейчас в последней строке выводится inf. Как мне изменить эту функцию, чтобы предотвратить переполнение?

Комментарии:

1. Я думаю , ты имел в виду res *= given_exp , что нет res *= res .

2. Дело не в том, что он переполняется, а в том, что ваш код неправильный. Попробуйте отладить его самостоятельно (вывести значения, запустить в отладчике) для некоторых небольших значений (скажем, 2 ^ 3).

Ответ №1:

Строка

                 res *= res;
 

неверно. Он будет вычислять res время res на каждой итерации и сделает число очень большим.

Это должно быть

                 res *= val;
 

Комментарии:

1. В частности, res *= res означает, что он вычисляет что-то вроде 2 ^ (2 ^ n) . (Или, если быть точным, это выглядит как 2 ^(2 ^(n-1)) для положительного n здесь.)