loge (a) принимает ненулевое положительное действительное число.
В функции х = а / 3. y = x-1 + a * exp (-x). Я буду продолжать вычитать их друг от друга (получаю абсолютную разницу) и буду продолжать, пока разница не станет меньше 0,000001. Мои друзья говорят мне, что я делаю правильно, но когда я пробую loge (2), я получаю 0.678 (что-то). Все, что выше, вызывает вину. Какие-нибудь советы? Благодарю.
#include <iostream>
using namespace std;
long double power(long double a, long int b);
long double power(long double a, long int b)
{
if (b == 0)
{
return 1;
}
else if (b == 1)
{
return a;
}
else if (b < 0)
{
return 1.0/power(a, -b);
}
else if (b%2==0)
{
return power(a*a, b/2);
}
else if (b%2!=0)
{
return a*power(a*a, b/2);
}
}long double exp(long double x);
long double exp(long double x)
{
if (x < 0.000001)
{
return 1+x+(power(x, 2)/2)+(power(x, 3)/6);
}
else
{
return power(exp(x/10), 10);
}
}long double loge(long double a);
long double loge(long double a)
{
long double x, y, lim = 0.000001;
if (a == 1)
{
return 0;
}
else
{
x = a/3;
y = x-1+a*exp(-x);
while (x*lim != y*lim)
{
x = y;
y = x-1+a*exp(-x);
}
return y;
}
}
int main()
{
long double num;
cout << "Enter a number: ";
cin >> num;
cout << loge(num);
cout << "\n";
return 0;
}
Если вы просто хотите вычислить натуральный логарифм числа, вы можете использовать std::log
. Чтобы вычислить логарифм с любой базой, вы можете написать такую функцию:
double log(double base, double x) {
return std::log(x)/std::log(base);
}
Вам нужно будет добавить код для проверки правильности ввода (например, base
не может быть равно 1 или меньше 0).
Если вы хотите реализовать натуральный лог без std::log
Вы можете взглянуть на std::numeric_limits
для вашего предела разницы вместо жесткого кодирования его lim = 0.000001
,