4

my_exp()入力として 1 を指定したときから結果 1.#INF を取得し続ける理由がわかりません。コードは次のとおりです。

double factorial(const int k)
{
    int prod = 1;
    for(int i=1; i<=k; i++)
        prod = i * prod;
    return prod;
}

double power(const double base, const int exponent)
{
    double result = 1;
    for(int i=1; i<=exponent; i++)
        result = result * base;
    return result;
}

double my_exp(double x)
{
    double sum = 1 + x;
    for(int k=2; k<50; k++)
        sum = sum + power(x,k) / factorial(k);
    return sum;
}
4

3 に答える 3

6

展開の各項の検出力と階乗項を完全に評価する代わりに、k 番目の項が k-1 番目の項にどのように関連しているかを検討し、この関係に基づいて各項を更新する必要があります。これにより、べき乗関数と階乗関数の厄介なオーバーフローが回避されます (これは不要になります)。例えば

double my_exp(double x)
{
    double sum = 1.0 + x;
    double term = x;                 // term for k = 1 is just x
    for (int k = 2; k < 50; k++)
    {
        term = term * x / (double)k; // term[k] = term[k-1] * x / k
        sum = sum + term;
    }
    return sum;
}
于 2011-10-19T16:04:27.513 に答える
-2

k フォーム 50 の最大値を 30 程度に減らすだけで機能します。

そして、あなたのコードが 0 のすぐ近くで機能するという質問がありますか?

于 2014-07-05T06:49:20.143 に答える