Эта функция вычисляет натуральный логарифм числа с точностью до 3 цифр?

В моем учебнике приведен следующий алгоритм, который должен вычислять натуральный логарифм числа с точностью до 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 и, следовательно, тест не пройден. Что мне не хватает?

1

Решение

Это нужно для того (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-й цифры.

1

Другие решения


По вопросам рекламы [email protected]