В моем учебнике приведен следующий алгоритм, который должен вычислять натуральный логарифм числа с точностью до 3 цифр.
#include <iostream>
#include <cmath>
double logN(double a, double li, double ls)
{
if(a == 1)
return 0;
else if(fabs(li - ls) < 0.0001)
return (li + ls) / 2;
else if((exp(li) - a) * (exp((li + ls) / 2) - a) < 0)
return logN(a, li, (li + ls) / 2);
else
return logN(a, (li + ls) / 2, ls);
}
int main()
{
std::cout << logN(3, 0, 3) << std::endl;
std::cout << logN(4, 0, 4) << std::endl;
std::cout << logN(5, 0, 5) << std::endl;
return 0;
}
Это утверждение выглядит неправильно для меня:
else if(fabs(li - ls) < 0.0001)
Например, если у меня есть 2 номера: 0.9992
а также 0.9996
, Оба числа имеют первые 3 цифры, но разница между ними 0.0004
который больше чем 0.0001
и, следовательно, тест не пройден. Что мне не хватает?
Это нужно для того (li + ls) / 2
работать правильно.
Например:
0.999 - 0.9981 = 0.0009 < 0.001
но:
(0.999 + 0.9981) / 2 = 0.99855
С другой стороны:
(0.9999 + 0.9998) / 2 = 0.99985
который округляется до 1, при округлении до 3-й цифры.