While循环条件为double和float

时间:2019-02-27 18:20:55

标签: c

我有一个简单的任务,说“用以下公式将y的值写成xmin和xmax之间的范围,并加上dx的差。 我唯一的问题是,在将float与while结合使用时,例如在我要提供的代码中,我得到的y输出比我应有的少。 对于以下代码

#include <stdio.h>
int main() {
    float x,xmin,xmax,dx,y;
    printf("Input the values of xmin xmax i dx");
    scanf("%f%f%f",&xmin,&xmax,&dx);
    x=xmin;
    while(x<=xmax) {
        y=(x*x-2*x-2)/(x*x+1);
        printf("%.3f   %.3f\n",x,y);
        x=x+dx;
    }
}

对于(-2 2 0.2)的输入,我最多只能输出1.8(即20个输出)而不是最多2。 但是,当我使用double而不是float时,一切都很好(有21个输出)。 是否有一些我不知道的与while条件有关的东西?

1 个答案:

答案 0 :(得分:-1)

这很有道理。浮点数或双精度数是有理数a / b:integers,b!= 0的近似值而不是精确值。您离1.000越近,近似值越好,但仍然是近似值。

有理数的一个子集可以保证完全由浮点表示形式表示为有理数:2 ^ k,其中k:integer [-126 <= x <= 127。例如。 const float dx = 0.25f; 〜1 /(2 ^ 2)可以正常工作。

  

0.2不表示为0.2而是表示为:0.20000000298023223876953125
  下一个最接近0.2的近似值是:0.199999988079071044921875
  https://www.h-schmidt.net/FloatConverter/IEEE754.html

循环浮动的另一种方法可能是:

#include <stdio.h>
int main() {
    float x,xmin,xmax,dx,y;
    printf("Input the values of xmin xmax i dx");
    scanf("%f%f%f",&xmin,&xmax,&dx);
    x=xmin;

    //expected cummulative error
    const float e = 0.7 * dx;

    do 
    {
        y=(x*x-2*x-2)/(x*x+1);
        printf("%.3f   %.3f\n",x,y);
        x=x+dx;
    }
    while(!(x > (xmax + e)));
}

上面的解决方案似乎可以按预期工作,但只能在少量迭代中实现。