开发一个算法来求一个正数的平房根。开始时,把这个正数本身作为根的第一个猜测值,以后按下列方法重复地产生新的猜测值:原正数除以现在的猜测值得到商,取这个商和该猜测值的平均值作为下一个猜测值。分析对这个重复过程的控制,特别是,重复的终止条件是什么?
这里的x和k分别表示什么?能写成c语言的形式吗?
追答x(k)表示的是第k个猜测值
追问如果要验证你的答案,比如求100的平方根,tol 应该设为多少合适?
追答如果你用c语言的话,取决于你用float还是double
float可以用2e-7, double可以用2e-16
我写了个c程序求100的平方根,结果怎么是50!
#include
#include
main()
{
float m = 100;
float n = 100, h;
float tol = 2e-7;
/*n表示x(k+1),m表示x(k)*/
while( fabs(n - m) < tol * n )
{
h = (m/n + n)/2;
m = n;
n = h;
}
printf( "%f\n", h );
return 0;
}
我写了个c程序求100的平方根,结果怎么是50!
#include
#include
main()
{
float m = 100;
float n = 100, h;
float tol = 2e-7;
/*n表示x(k+1),m表示x(k)*/
while( fabs(n - m) < tol * n )
{
h = (m/n + n)/2;
m = n;
n = h;
}
printf( "%f\n", h );
return 0;
}
#include
#include
int main()
{
float a = 100;
float m = 100;
float n = 100, h;
float tol = 2e-7;
do
{
h = (a/n + n)/2;
m = n;
n = h;
} while( fabs(n - m) > tol * n );
printf( "%f\n", h );
return 0;
}
#include
main(void)
{
float m = 100, n, h;
n = m;
while( n * n != m )
{
h = (m/n + n)/2;
n = h;
}
printf( "%f\n", n );
return 0;
}
只需这样就搞定了,呵呵。
我们都想复杂了,思维啊!
你把问题想得太简单了,浮点数有舍入误差,如果要求n*n==m有可能会出现死循环
追问其实连变量tol 都不需要,直接写为while(fabs(n-a) == 0)即可。因为不管有没有发生溢出,最终n减a都将是0!
其实连变量tol 都不需要,直接写为while(fabs(n-a) != 0)即可。因为不管有没有发生溢出,最终n减a都将是0!
追答还是那句话,你把问题想得太简单了,你缺乏浮点运算的基本知识
尽管Newton法有二次收敛性,但要想用等号来判断至少需要排除浮点运算下迭代法出现交错的情况,要证明这一点需要加很多额外的条件,且不论这是不是真的成立,即使成立你也得验证所有条件都满足,绝不是像你想象的那么简单