#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 здесь.)