C语言中小数的误差怎么解决

Python014

C语言中小数的误差怎么解决,第1张

一般是:根据问题领域所容许的的精度,定义一个误差上限(一个极小数)。然后在浮点计算时,计算结果与这个误差上限作比较,而不是与0作比较。

例如,牛顿迭代法求值:

double f(double x) // f(x)

double f1(double x)// f(x)的导函数

#define EPSILON 0.001 // 误差精度

double resolve(double x) { // x为初始近似解

while (1) {

double delta = f(x) / f1(x)

// 当迭代的变化量,小于误差精度时,就认为找到解了

if (delta >- EPSILON &&delta <EPSILON) {

break

}

x -= delta

}

return x

}

浮点数的比较很麻烦,像while(sx>=0.1)这个等号很不保险

要判断一个浮点数是否等于另外一个浮点数,一般是求二者的差,差的绝对值小于某给定值就算相等 像这样:

while((sx-0.1)<0.00001&&(0.1-sx)<0.00001)

{

sx=0

printf("0.1=1\n")

}

总之,在程序中应该尽量避免浮点数的比较

这是在算除法时出现小数精度不足的问题,但这个题目的答案应该是2008*1/2*2/3*3/4*...*2008/2009

因为你是说第2008次,那分子是2008才对。如果你算到1只是算到2007次。

最后结果应该是2008/2009≈0.99950223992035838725734196117471

而你程序中的printf("%1.25f",n)中的“%1.25f”不起作用,如果改成“%f”结果是0.999502,如果改成“%.2f”结果就是1.00