0

loge(a) はゼロ以外の正の実数である a を取ります。

関数では、x = 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;
}
4

1 に答える 1

2

単純に数値の自然対数を計算したい場合は、 を使用できますstd::log。任意の底で対数を計算するには、次のような関数を記述できます。

double log(double base, double x) {
  return std::log(x)/std::log(base);
}

有効な入力をチェックするコードを追加する必要があります (たとえばbase、1 以下にすることはできません)。

せずに自然対数を実装したい場合std::logstd::numeric_limitslim = 0.000001.

于 2014-08-21T17:47:49.003 に答える