【问题标题】:How to fix my e^x approximation C program?如何修复我的 e^x 近似 C 程序?
【发布时间】:2017-07-10 01:12:48
【问题描述】:

我编写了一个 C 程序,该程序应该计算并打印直到 n 的所有值的 e^x 的近似值。我正在使用这个等式来实现我的程序。

f(x, n) = e^x = i=0 到 n= x^i/x 的总和! = x^0/0! + x^1/1! + x^2/2! +....+ x^n/n!

这是我的代码:

#include <stdio.h>
#include <math.h>
#include <stdlib.h>

double factorial(int n){
        double fac =1;
        int i;
        for(i =1; i <= n; i++){ 
                fac *=n;
        }
        return fac;
}
double exponent(double x, int n){
        double sum, i;
        for(i = 0; i <=n; i++){
                sum +=  (pow(x, i)/ factorial(i));
        } 
        return sum;
}

int main(int argc, char *argv[]){
        int n = atoi(argv[1]);
        double x = atof(argv[2]);
        printf("\ti\tApproximantion\n");
        printf("-------------------------------------\n");
        int i;
        for(i =0; i <=n; i++){
               printf("\t%d\t%f\n", i, exponent(x,i));
        }
        printf("Exact Value =\t%12f\n", exp(x));
        return 0;
}//main

我使用迭代而不是递归。 我当前使用./aprroximation 10 2.2 的输出是:

        i       Approximation
-------------------------------------
        0       1.000000
        1       3.200000
        2       4.410000
        3       4.804370
        4       7.895877
        5       8.912368
        6       9.914798
        7       10.915101
        8       11.915134
        9       12.915137
        10      13.915137
Exact Value =       9.025013

输出应该是:(忽略空格/制表符)

   i Approximation
--------------------------------
   0   1.0000000000
   1   3.2000000000
   2   5.6200000000
   3   7.3946666667
   4   8.3707333333
   5   8.8002026667
   6   8.9576747556
   7   9.0071659835
   8   9.0207760712
   9   9.0241029815
   10   9.0248349018
Exact Value = 9.0250134994

我似乎无法在我的代码中找到问题所在。我查看了阶乘函数和幂函数的一些伪代码,但没有什么特别突出的。我的结果仍然是错误的。有什么想法吗?

【问题讨论】:

  • 一遍又一遍地重新计算阶乘是幼稚且昂贵的。
  • 从您的输出看来,sum 在第 9 步之后每次都增加 1。您能否通过输入 n 而不是 10 而是输入 13-15 来检查这一点,看看是否如此持有?
  • 嗯,我无法用你的代码重现,输出不同:ideone
  • @duffymo 当然它很贵,但这看起来更像是一个练习。一旦它工作了,还有时间进行优化,但无论如何,在现实世界中,我们不需要该代码,因为我们只需使用 exp 函数。
  • 我认为应该教学生正确编码和思考。

标签: c function math output


【解决方案1】:

有两个问题:

  1. exponent 函数中,您没有初始化sum
  2. 您的factorial 函数有误。

如果您单独测试过factorial 函数,至少您自己会很容易发现这个问题。

【讨论】:

    【解决方案2】:

    我明白了,您没有在 exponent() 函数中初始化变量 sum。将其初始化为零,否则exponent() 函数看起来没问题。

    double exponent(double x, int n){
        double sum = 0, i;
        for(i = 0; i <=n; i++){
            sum += pow(x, i)/ factorial(i);
        } 
        return sum;
    }
    

    更新

    我在factorial() 函数中发现了另一个问题。试想一下,for 循环内的语句是否正确!

    for(i=1; i<=n; i++){ 
        fac *= n;
    }
    

    你在这里计算的不是n!,而是n^n。您应该执行以下操作。

    for(i=1; i<=n; i++){ 
        fac *= i;
    }
    

    【讨论】:

    • 我没有注意到这一点。这确实有帮助,但我的最高数字仍然是 4,所以输出是错误的。您还能发现其他错误吗?
    猜你喜欢
    • 2011-10-22
    • 1970-01-01
    • 1970-01-01
    • 2020-12-11
    • 1970-01-01
    • 2018-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多