【问题标题】:Evaluating Taylor series expansion of e^x in C评估 C 中 e^x 的泰勒级数展开
【发布时间】:2017-05-13 00:58:46
【问题描述】:

我对 C 编程非常陌生。在这里,我编写了一个非常简单的 C 程序来评估指数函数 e^x 的泰勒级数展开,但我的输出中出现错误,尽管程序编译成功。

#include <stdio.h>
int main()
{
double sum;
int x;
printf("Enter the value of x: ");
scanf("%d",&x);
sum=1+x+(x^2)/2+(x^3)/6+(x^4)/24+(x^5)/120+(x^6)/720;
printf("The value of e^%d is %.3lf",x,sum);
return 0;
}

【问题讨论】:

标签: c taylor-series


【解决方案1】:

^ 在 C 中不是指数运算符。它是按位运算符。对于少数项,乘以更容易。

您还需要注意整数除法。如果你除以x*x/2,那么你将得到整数除法。您需要将数字除以得到双重答案,如下所示。

您可以将计算总和的行替换为以下行。

sum=1+x+(x*x)/2.0+(x*x*x)/6.0+(x*x*x*x)/24.0+(x*x*x*x*x)/120.0+(x*x*x*x*x*x)/720.0;

更好的选择是使用循环来计算每个术语并将其添加到答案中。

double answer, term = 1;
int divisor = 1;
amswer = term;
for (i=0; i<6; i++)
{
   term = term * x / divisor;
   answer += term;
   divisor *= (i+2);
}   

【讨论】:

  • divisor 也可以是double。否则每次执行 term = term * x / divisor 时可能会发生类型转换 - 不过需要检查 asm 输出。
  • divisor 可以是整数,只要不超出范围即可。对于 32 位整数,它最多可以工作 12 项。如果您使用unsigned long long int,它最多可以使用 20 个术语。每个术语的除法在 double 和 int 之间,后者将解析为 double。
  • 不,前面的评论者说的是当你调用 ... / divisior 时,intdouble 的隐式转换。这样的转换非常缓慢。
  • 另外,你的大括号不是 K&R,i + 2 周围有多余的括号,正确的循环子句应该是 for (int i = 0; i &lt; 6; ++i) {
【解决方案2】:
  1. 使用 pow() 代替 ^
  2. 使用 double x 代替 int x

所以结果代码将如下所示:

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

int main()
{
    double sum;
    double x;
    printf("Enter the value of x: ");
    scanf("%lf",&x);
    sum=1+x+pow(x,2)/2+pow(x,3)/6+pow(x,4)/24+pow(x,5)/120+pow(x,6)/720;
    printf("The value of e^%f is %.3lf",x,sum);
    return 0;
}

它应该与数学库链接,即:

gcc prog.c -lm

【讨论】:

    【解决方案3】:

    由于其他人未能提供适当的 C 代码,我必须尝试一下:

    #include <stdio.h>
    int main() {
        printf("Enter the value of x: ");
        double x;
        scanf("%lf", &x);
        double sum = 1.0 + x * (1.0 + x * (1.0 / 2 + x * (1.0 / 3 + x * (1.0 / 4 + x * (1.0 / 5 + x / 6.0)))));
        printf("The value of e^%.3lf is %.3lf", x, sum);
    }
    

    【讨论】:

      【解决方案4】:
      Better make it dynamic like this one.
      
      
      #include <stdio.h>
      
      int power(int x,int n){
      int sum=1,i;  
      if (n == 0)
          return 1;
      
        for(i=1; i<= n; i++){
          sum *= x;
        }
       return sum;
      }
      
      int fact(int n){
       if(n == 0)
         return 1;
      
       for(i=1; i<= n; i++){
         fact *=i;
       }
        return fact;
      }
      
      
      int main()
      {
      float sum=0.0;
      int i,x,n;
      printf("Enter the value of x and n terms: ");
      scanf("%d %d",&x,&n);
       for(i=0; i<=n; i++){
        sum += (float)power(x,i)/fact(i);
       }
      printf("The value of %d^%d is %.3f",x,n,sum);
      return 0;
      }
      

      【讨论】:

      • 您的代码是O(N^2),其中 N 是多项式的幂,而且格式非常糟糕。
      猜你喜欢
      • 2016-01-24
      • 2019-04-11
      • 2021-12-26
      • 2020-04-01
      • 2020-12-12
      • 2011-12-06
      • 1970-01-01
      • 2017-06-14
      • 2020-10-27
      相关资源
      最近更新 更多