#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条件有关的东西?
答案 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)));
}
上面的解决方案似乎可以按预期工作,但只能在少量迭代中实现。