例如,牛顿迭代法求值:
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