问一个c++迭代法开方的问题:

迭代公式就是指用现在的值,代到一个公式里面,算出下一个值
再用下一个值代入公式,如此往复地代。公式是x=(x+a/x)/2
比如对2开方
x=(x+2/x)/2
你随便拿一个x=10代入,得x=(10+2/10)/2=5.1
再代进去x=(5.1+2/5.1)/2=2.746
再代入得1.737
再代得1.444
再代得1.414525655
再代得1.414213597
再代得1.414213562
初始不用10,用任一个正数,只要计算几次都可以得到1.414213562这样的结果。
******************************************************************
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
float a,x0,x1;
cout<<"请输入要开方的数:";
cin>>a;
x0=a/2;
x1=(x0+a/x0)/2;
do
{
x0=x1;
x1=(x0+a/x0)/2;
}while(fabs(x0-x1)<=1e-5);
cout<<a<<"的开方是:"<<x1<<endl;
return 0;
}
问题一:为什么x0要赋值为a/2,不是任何一个整数都可以吗,我对x0赋值1的时候为什么对4和9开方误差很大。
问题二:为什么我按教材对x0赋值a/2时,求4的开方会失败。
问题三:这个程序可以适用非整数的迭代法开方吗.
问题四:有没用更好的迭代法高精度开方的C++源程序,给我一下。

第1个回答  2011-05-17
一、a/2是可以的,其他值也可以,如a/3,a/4等等
二、你的程序有问题,while(fabs(x0-x1)<=1e-5)改为while(fabs(x0-x1)>=1e-5)
三、可以
四、不好意思,我暂时还不知道,其实你的方法已经很高效了
第2个回答  2011-05-16
初值赋值为a/2,可以减少迭代次数
while(fabs(x0-x1)<=1e-5)这个是while(fabs(x0-x1)>=1e-5)
可以适用非整数本回答被提问者采纳

问一个c++迭代法开方的问题:
一、a\/2是可以的,其他值也可以,如a\/3,a\/4等等 二、你的程序有问题,while(fabs(x0-x1)<=1e-5)改为while(fabs(x0-x1)>=1e-5)三、可以 四、不好意思,我暂时还不知道,其实你的方法已经很高效了

一个小C++程序,迭代法求数的开平方!
楼主写错了第一次循环是x1中的值是随机的,应该把x0=x1放到x1=(x0+a\/x0)\/2;后面

c++ 迭代法求根号
第一个,你写的int main()最后要求返回一个int 第二个,x没有赋初值,应该是x=a\/2;y其实也应该赋初值,比如0 第三个,进入循环的条件应该是while(fabs(x-y)>1e-5),原程序正好反了,根本没有进入迭代过程 第四个,没有判断输入非负 include <cstdlib>#include <iostream>#include <cmath>...

c++ 迭代法求根号
第一个,你写的int main()最后要求返回一个int 第二个,x没有赋初值,应该是x=a\/2;y其实也应该赋初值,比如0 第三个,进入循环的条件应该是while(fabs(x-y)>1e-5),原程序正好反了,根本没有进入迭代过程 第四个,没有判断输入非负 include <cstdlib>#include <iostream>#include <cmath>...

C++调用平方根函数问题
用迭代法求某数a的平方根。已知求平方根的迭代公式为:x n+1 = (xn + a \/ xn) \/ 2要求前后两次求出的差的绝对值小于10-5。算法如下:① 设定一个x的初值x0 ; (在如下程序中取x0=a\/2, 通过迭代公式求出x1,可以肯定与真正的平方根相比,误差很大。)② 用上述公式求出x的下一个值 ...

C++编程:用迭代法解方程:X=4-2^X.求x?
从数学分析的方法可以知道这个方程不收敛;所以我们用等价的方程:x=lg(4-x)\/lg2 来乾迭代。代码如下(DEV CPP 4.9.9.2环境)include <cstdlib> include <iostream> include <math.h> using namespace std;int main(int argc, char *argv[]){ double ex=0.00001; \/\/控制精度 double ...

C++ 调试下这个用迭代法求平方根的程序
我自己写了个牛顿迭代法的求开方的函数...没看懂你用的是哪个迭代公式...include <iostream>using namespace std;inline double absolute(double x){ if(x<0) x=-x; return x;}\/\/使用牛顿迭代法求取开方值~~~int square(double y, double resolution, double &x){ if(y<0) { cerr<<...

C++ 编程,迭代法解方程,急求
第一个办法比较简单,就是利用一元三次方程的求根公式,具体算法请参看关于一元三次方程的卡尔丹方法;第二个办法是利用高斯-塞德尔迭代法把方程变形为:x=(63x³-114x²+42)\/95 把初始迭代值(即-1.0, 0.4和1.2三值)分别代入上述方程,得到一个近似x值,然后再把这个值回代入...

迭代法求平方根,【c++】#include <iostream>
x=(x+a\/x)\/2;你可能比较有问题应该是在while里面,fabs的功能:求浮点数((x-a\/x)\/2)的绝对值,计算|((x-a\/x)\/2)|, 当((x-a\/x)\/2)不为负时返回((x-a\/x)\/2),否则返回-((x-a\/x)\/2);1e-7是精确值,循环条件是((x-a\/x)\/2)的绝对值不小于1e-7。算式是牛顿迭代法...

c++用迭代法求立方根
include<iostream>#include<cmath>using namespace std; int main(){ double x1,x2,a; cout<<"input x1="; cin>>a; x1=2; x2=0.0; \/\/ while(abs(x1-x2)<1e-5) while((x1-x2 >1e-5) || (x1-x2< -1e-5)) { x2=x1; x1=2*x2\/3.0+a\/(3*...

相似回答
大家正在搜