【问题标题】:Approximation of a power series using a do-while loop - C使用 do-while 循环逼近幂级数 - C
【发布时间】:2018-09-10 19:47:24
【问题描述】:

标题几乎是不言自明的。我试图近似一个可以写为 f(x) = x¹/(1x2) -x³/(3x4) +x^(5)/(5x6) + ... 的系列,条件是总和应该停止当术语的模块低于用户输入的容差时。例如,如果 x=0.5 且容差=0.01,则结果应为 0.239583,因为这是前两项之和(均高于 0.01)。下面的代码只计算第一项,然后由于某种我无法弄清楚的原因停止循环。如何进行?

int main()
{
    double x, e, result=0, term;
    int i=1;

    printf("Write some value to x: ");
    scanf("%lf", &x);

    if(x<-1 || x>1)
    {
        printf("Invalid number");
    }

    else
    {
        printf("Write the tolerance: ");
        scanf("%lf", &e);

        do
        {
            term=(pow(x, 2*i-1)*pow(-1, i+1))/((2*i-1)*(2*i));
            result+=term;
            i+=1;
        }
        while(abs(term)>=e);

        printf("The result is: %.6lf", result);
    }

    return 0;
}

【问题讨论】:

  • 对不起,弄错了:“结果应该是0.239583,因为那是前两项之和(都高于0.01)”。
  • .. 所以请编辑问题。
  • 只有一种方法可以让您的do while 循环终止,那就是term 的绝对值大于或等于e (abs(term) &gt;= e)。也许eterm 不是您所期望的那样。
  • 旁白:abs() ==> fabs() 因为您使用的是double。您还必须检查scanf 返回值(成功输入),然后检查输入范围。
  • 请注意,您可以使用pow() 计算所有这些项,x^n 和 (-1)^n,没有

标签: c loops do-while numerical-methods approximation


【解决方案1】:

abs() 函数来自stdlib.h,签名为int abs(int x)。由于您使用浮点数调用它,因此该数字会被截断。在这种情况下,截断的数字为 0,小于容差,因此循环提前退出。

您想使用fabs(),这是abs() 的浮点版本,它来自math.h。它有签名double fabs(double x)

【讨论】:

  • 这会被-Wconversion 捕获(它包含在-Wall-Wextra 中):test.c:28:19: warning: conversion to ‘int’ from ‘double’ may alter its value [-Wfloat-conversion] while(abs(term)&gt;=e);
猜你喜欢
  • 2018-05-09
  • 1970-01-01
  • 2016-09-23
  • 2016-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多