怎么计算某数的平方根?

作者&投稿:鄹耿 (若有异议请与网页底部的电邮联系)
如何手算求一个数的平方根~

述求平方根的方法,称为笔算开平方法,用这个方法可以求出任何正数的算术平方根,它的计算步骤如下:

1.将被开方数的整数部分从个位起向左每隔两位划为一段,用撇号分开(竖式中的11'56),分成几段,表示所求平方根是几位数;

2.根据左边第一段里的数,求得平方根的最高位上的数(竖式中的3);

3.从第一段的数减去最高位上数的平方,在它们的差的右边写上第二段数组成第一个余数(竖式中的256);

4.把求得的最高位数乘以20去试除第一个余数,所得的最大整数作为试商(3×20除 256,所得的最大整数是 4,即试商是4);

5.用商的最高位数的20倍加上这个试商再乘以试商.如果所得的积小于或等于余数,试商就是平方根的第二位数;如果所得的积大于余数,就把试商减小再试(竖式中(20×3+4)×4=256,说明试商4就是平方根的第二位数);

6.用同样的方法,继续求平方根的其他各位上的数.

参考资料:http://www.tjjy.com.cn/pkuschool/teacher/its/chu2/sx/2/1.1-3.htm

平方根的计算方法计算方法一:我们用a来表示A的平方根,方程x-a=0的解就为A的平方根a。两边平方后有:x*x-2ax+A=0,因为x不等于0,两边除以x有:x-2a+A/x=0、a=(x+A/x)/2所以你只需设置一个约等于(x+A/x)/2的初始值,代入上面公式,可以得到一个更加近似的值。再将它代入,又可以得到一个更加精确的值……依此方法,最后得到一个足够精度的(x+A/x)/2的值即为A的平方根值。真的是这样吗?假设我们代入的值x﹤a 由于这里考虑a﹥0故:x*x﹤a*a 即x﹤A/x(x+A/x)/2﹥(x+x)/2 即(x+A/x)/2>x 即当代入的x﹤a时(x+A/x)/2的值将比x大。同样可以证明当代入的x﹥a时(x+A/x)/2的值将比x小。这样随着计算次数的增加,(x+A/x)/2的值就越来越接近a的值了。如:计算sqrt(5) 设初值为x = 2 第一次计算:(2+5/2)/2=2.25 第二次计算:(2.25+5/2.25)/2=2.236111 第三次计算:(2.236111+5/2.236111)/2=2.236068 这三步所得的结果和5 的平方根值相差已经小于0.001 了。 计算方法二:我们可以使用二分法来计算平方根。设f(x)=x*x - A同样设置a为A的平方根,哪么a就是f(x)=0的根。你可以先找两个正值m,n使f(m)0 根据函数的单调性,a就在区间(m,n)间。然后计算(m+n)/2,计算f((m+n)/2),如果它大于零,那么a就在区间(m,(m+n)/2)之间。小于零,就在((m+n)/2,n)之间,如果等于零,那么(m+n)/2当然就是a。这样重复几次,你可以把a存在的范围一步步缩小,在最后足够精确的区间内随便取一个值,它就约等于a。计算方法三:以上的方法都不是很直接,在上世纪80年代的初中数学书上,都还在介绍一种比较直接的计算方法:(1)如求54756的算术平方根时先由个位向左两位两位地定位:定位为5,47,56,接着象一般除法那样列出除式.(2)先从最高位用最大平方数试商:最大平方数不超过5的是2,得商后,除式5-4后得1。把商2写上除式上。(3)加上下一位的数:得147。(4)用20去乘商后去试商147:2×20=40 这40可试商为3,那就把试商的3加上40去除147。得147÷43=3,把3写上除式上。这时147-129=18。(5)加上下一位的数:得1856。(6)用20去乘商后去试商1856:23×20=460 这460可试商为4,那就把试商的4加到460去除1856。得4,把4写上除式上。这时1856-1856=0,无余数啦。(7)这时除式上的商是234,即是54756的平方根。哪么这种计算方法是怎么得来的呢?查找了好久都没有找到答案。静下心来仔细分平方根的计算过程,后来的步骤都有20乘以也有的商再加上预计的商乘上预计的商。设也有的商为a预计的商为b就是(20*a+b)*b即20ab+b*b。而实质上预计的商是平方根中已有的商的后一位数字,平方根实际为10a+b再乘以10的N次方(N为整数),这里我们可以简化为平方根为10a+b(因为乘10的N次方只影响平方的小数点位置,对数字计算没有影响)。这下终于明白了,设a为A的平方根的前n位,b为A的平方根的n位后面的数字,哪么(10a+b)就是A的平方根。有:(10a+b)(10a+b)=100a*a+20ab+b*b=A变形后:(20a+b)b=A-100a*a上面的计算中第一次商2,然后从结果中减4实质就是A-100a*a第二次再预计商3再减去(20*2+3)*3实质就是:A-100a*a-20ab-b*b即:A-(10a+b)(10a+b)此时10a+b看作为新的已有商a,再求下一个b值。这样就可以一位一位地进行平方根的求解了。

如果一个数的开方是无理数. 直接就用:

如√20即简写,不必具体写出该数.

平方根就是开二次方运算的值. 它的逆运算就是乘二次方.

//
// 计算参数x的平方根的倒数
//
float InvSqrt (float x)
{
float xhalf = 0.5f*x;
int i = *(int*)&x;
i = 0x5f3759df - (i >> 1); // 计算第一个近似根
x = *(float*)&i;
x = x*(1.5f - xhalf*x*x); // 牛顿迭代法
return x;
}
该算法的本质其实就是牛顿迭代法(Newton-Raphson Method,简称NR),而NR的基础则是泰勒级数(Taylor Series)。NR是一种求方程的近似根的方法。首先要估计一个与方程的根比较靠近的数值,然后根据公式推算下一个更加近似的数值,不断重复直到可以获得满意的精度。其公式如下:

函数:y=f(x)

其一阶导数为:y'=f'(x)

则方程:f(x)=0 的第n+1个近似根为

x[n+1] = x[n] - f(x[n]) / f'(x[n])
NR最关键的地方在于估计第一个近似根。如果该近似根与真根足够靠近的话,那么只需要少数几次迭代,就可以得到满意的解。

现在回过头来看看如何利用牛顿法来解决我们的问题。求平方根的倒数,实际就是求方程1/(x^2)-a=0的解。将该方程按牛顿迭代法的公式展开为:

x[n+1]=1/2*x[n]*(3-a*x[n]*x[n])
将1/2放到括号里面,就得到了上面那个函数的倒数第二行。

接着,我们要设法估计第一个近似根。这也是上面的函数最神奇的地方。它通过某种方法算出了一个与真根非常接近的近似根,因此它只需要使用一次迭代过程就获得了较满意的解。它是怎样做到的呢?所有的奥妙就在于这一行:

i = 0x5f3759df - (i >> 1); // 计算第一个近似根
超级莫名其妙的语句,不是吗?但仔细想一下的话,还是可以理解的。我们知道,IEEE标准下,float类型的数据在32位系统上是这样表示的(大体来说就是这样,但省略了很多细节,有兴趣可以GOOGLE):

bits:31 30 ... 0
31:符号位
30-23:共8位,保存指数(E)
22-0:共23位,保存尾数(M)
所以,32位的浮点数用十进制实数表示就是:M*2^E。开根然后倒数就是:M^(-1/2)*2^(-E/2)。现在就 十分清晰了。语句i>>1其工作就是将指数除以2,实现2^(E/2)的部分。而前面用一个常数减去它,目的就是得到M^(1/2)同时反转所有指数的符号。

至于那个0x5f3759df,呃,我只能说,的确是一个超级的Magic Number。

那 个Magic Number是可以推导出来的,但我并不打算在这里讨论,因为实在太繁琐了。简单来说,其原理如下:因为IEEE的浮点数中,尾数M省略了最前面的1,所以实际的尾数是1+M。如果你在大学上数学课没有打瞌睡的话,那么当你看到(1+M)^(-1/2)这样的形式时,应该会马上联想的到它的泰勒级数展开, 而该展开式的第一项就是常数。下面给出简单的推导过程:

对于实数R>0,假设其在IEEE的浮点表示中,
指数为E,尾数为M,则:

R^(-1/2)
= (1+M)^(-1/2) * 2^(-E/2)

将(1+M)^(-1/2)按泰勒级数展开,取第一项,得:

原式
= (1-M/2) * 2^(-E/2)
= 2^(-E/2) - (M/2) * 2^(-E/2)

如果不考虑指数的符号的话,
(M/2)*2^(E/2)正是(R>>1),
而在IEEE表示中,指数的符号只需简单地加上一个偏移即可,
而式子的前半部分刚好是个常数,所以原式可以转化为:

原式 = C - (M/2)*2^(E/2) = C - (R>>1),其中C为常数

所以只需要解方程:
R^(-1/2)
= (1+M)^(-1/2) * 2^(-E/2)
= C - (R>>1)
求出令到相对误差最小的C值就可以了

上面的推导过程只是我个人的理解,并未得到证实。而Chris Lomont则在他的论文中详细讨论了最后那个方程的解法,并尝试在实际的机器上寻找最佳的常数C。有兴趣的朋友可以在文末找到他的论文的链接。

所以,所谓的Magic Number,并不是从N元宇宙的某个星系由于时空扭曲而掉到地球上的,而是几百年前就有的数学理论。只要熟悉NR和泰勒级数,你我同样有能力作出类似的优化。

在GameDev.net上有人做过测试,该函数的相对误差约为0.177585%,速度比C标准库的sqrt提高超过20%。如果增加一次迭代过程,相对误差可以降低到e-004 的级数,但速度也会降到和sqrt差不多。据说在DOOM3中,Carmack通过查找表进一步优化了该算法,精度近乎完美,而且速度也比原版提高了一截(正在努力弄源码,谁有发我一份)。

值得注意的是,在Chris Lomont的演算中,理论上最优秀的常数(精度最高)是0x5f37642f,并且在实际测试中,如果只使用一次迭代的话,其效果也是最好的。但奇怪的是,经过两次NR后,在该常数下解的精度将降低得非常厉害(天知道是怎么回事!)。经过实际的测试,Chris Lomont认为,最优秀的常数是0x5f375a86。如果换成64位的double版本的话,算法还是一样的,而最优常数则为0x5fe6ec85e7de30da(又一个令人冒汗的Magic Number - -b)。

这个算法依赖于浮点数的内部表示和字节顺序,所以是不具移植性的。如果放到Mac上跑就会挂掉。如果想具备可移植性,还是乖乖用sqrt好了。但算法思想是通用的。大家可以尝试推算一下相应的平方根算法。

下面给出Carmack在QUAKE3中使用的平方根算法。Carmack已经将QUAKE3的所有源代码捐给开源了,所以大家可以放心使用,不用担心会收到律师信。

//
// Carmack在QUAKE3中使用的计算平方根的函数
//
float CarmSqrt(float x){
union{
int intPart;
float floatPart;
} convertor;
union{
int intPart;
float floatPart;
} convertor2;
convertor.floatPart = x;
convertor2.floatPart = x;
convertor.intPart = 0x1FBCF800 + (convertor.intPart >> 1);
convertor2.intPart = 0x5f3759df - (convertor2.intPart >> 1);
return 0.5f*(convertor.floatPart + (x * convertor2.floatPart));
}
另一个基于同样算法的更高速度的sqrt实现如下。其只是简单地将指数除以2,并没有考虑尾数的方根。要看懂该代码的话必 须知道,在IEEE浮点数的格式中,E是由实际的指数加127得到的。例如,如果实数是0.1234*2^10,在浮点表示中,E(第23-30位)的值其实为10+127=137。所以下面的代码中,要处理127偏移,这就是常数0x3f800000的作用。我没实际测试过该函数,所以对其优劣无从评 论,但估计其精度应该会降低很多。

float Faster_Sqrtf(float f)
{
float result;
_asm
{
mov eax, f
sub eax, 0x3f800000
sar eax, 1
add eax, 0x3f800000
mov result, eax
}
return result;
}
除了基于NR的方法外,其他常见的快速算法还有多项式逼近。下面的函数取自《3D游戏编程大师技巧》,它使用一个多项式来近似替代原来的长度方程,但我搞不清楚作者使用的公式是怎么推导出来的(如果你知道的话请告诉我,谢谢)。

//
// 这个函数计算从(0,0)到(x,y)的距离,相对误差为3.5%
//
int FastDistance2D(int x, int y)
{
x = abs(x);
y = abs(y);
int mn = MIN(x,y);
return(x+y-(mn>>1)-(mn>>2)+(mn>>4));
}
//
// 该函数计算(0,0,0)到(x,y,z)的距离,相对误差为8%
//
float FastDistance3D(float fx, float fy, float fz)
{
int temp;
int x,y,z;
// 确保所有的值为正
x = int(fabs(fx) * 1024);
y = int(fabs(fy) * 1024);
z = int(fabs(fz) * 1024);
// 排序
if (y < x) SWAP(x,y,temp)
if (z < y) SWAP(y,z,temp)
if (y < x) SWAP(x,y,temp)
int dist = (z + 11 * (y >> 5) + (x >> 2) );
return((float)(dist >> 10));
}
还有一种方法称为Distance Estimates(距离评估?),如下图所示:

红线所描绘的正八边形上的点为:

octagon(x,y) = min((1/√2) * (|x|+|y|), max(|x|,|y|))
求出向量v1和v2的长度,则:

√(x^2+y^2) = (|v1|+|v2|)/2 * octagon(x,y)
到目前为止我们都在讨论浮点数的方根算法,接下来轮到整数的方根算法。也许有人认为对整型数据求方根无任何意义,因为会得 到类似99^(1/2)=9的结果。通常情况下确实是这样,但当我们使用定点数的时候(定点数仍然被应用在很多系统上面,例如任天堂的GBA之类的手持设备),整数的方根算法就显得非常重要。对整数开平方的算法如下。我并不打算在这讨论它(事实是我也没有仔细考究,因为在短期内都不会用到- -b),但你可以在文末James Ulery的论文中找到非常详细的推导过程。

//
// 为了阅读的需要,我在下面的宏定义中添加了换行符
//
#define step(shift)
if((0x40000000l >> shift) + sqrtVal <= val)
{
val -= (0x40000000l >> shift) + sqrtVal;
sqrtVal = (sqrtVal >> 1) | (0x40000000l >> shift);
}
else
{
sqrtVal = sqrtVal >> 1;
}
//
// 计算32位整数的平方根
//
int32 xxgluSqrtFx(int32 val)
{
// Note: This fast square root function
// only works with an even Q_FACTOR
int32 sqrtVal = 0;
step(0);
step(2);
step(4);
step(6);
step(8);
step(10);
step(12);
step(14);
step(16);
step(18);
step(20);
step(22);
step(24);
step(26);
step(28);
step(30);
if(sqrtVal < val)
{
++sqrtVal;
}
sqrtVal <<= (Q_FACTOR)/2;
return(sqrtVal);
}

平方根的概念
若x^2=a(a≥0),则x就叫做a的平方根.
意义是
(1)一个正数有两个平方根,它们互为相反数。
(2)0的平方根是0。
(3)负数没有平方根。
20的平方根是±√20
初二会学

初二就学的了,你给晕!你知3×3等多少吗?3就是9的平方根!

x的平方是20 x就是20的平方根

B*B=A,那B就是A的平方根.小学吧,大概4年级,根据教材回有不同


求一个数的平方根怎么算
开方的计算步骤:1、将被开方数的整数部分从个位起向左每隔两位划为一段,用撇号分开(竖式中的11’56),分成几段,表示所求平方根是几位数;2、根据左边第一段里的数,求得平方根的最高位上的数(竖式中的3);3、从第一段的数减去最高位上数的平方,在它们的差的右边写上第二段数组成...

平方根的计算公式是什么?
具体计算平方根的常用方法有以下几种:1. 直接使用计算器或电脑软件提供的平方根函数;2. 使用二分法或牛顿法等数值计算方法逼近平方根的值;3. 对于一些特殊的整数平方根,可以查表或使用方法进行计算;4. 对于一些平方根可以表示为有理数的情况,可以使用有理数的求根公式进行计算。需要注意的是,对于...

怎么计算一个数的平方根?
在 Excel 中,可以使用 SQRT 函数来计算一个数的平方根。以下是使用 SQRT 函数来开根号的步骤:选择一个单元格。在选定的单元格中输入“=SQRT(数字)”公式,其中“数字”代表要计算平方根的数值。按下“Enter”键或单击公式栏中的“√”按钮以计算平方根。例如,如果要计算数字 16 的平方根,可以在...

平方根是怎么求的?
例算如下:假设要求6的平方根,当Xn和X(n+1)的差值小于0.001时,可以认为已经找到了精确值。根据牛顿迭代法的步骤,首先猜测一个值X1,猜测X1=6\/2=3。将X1=3代入公式X(n+1)=(Xn+a\/Xn)\/2,则X2=(X1+6\/X1)\/2=(3+6\/3)\/2=2.5,由于3和2.5的差大于0.001,需要继续计算...

怎么求一个数的平方根?
第一种方法:用计算器。不用我教你吧!第二种方法:用笔算。开二次方的根据:(10a+b)²=100a²+20ab+b²=100a²+b(20a+b)我们用15129来举例:因为在被开方数中a是被100倍出现的,所以被开方数应该两位一分节,即1,51,29 第一步:第一节为1,所以a只能是1。第一...

怎么快速求出一个数的平方根?
对这个数进行分解,看它能由哪些数字相乘得到,然后再看这些约数之间的关系,就可以得到平方根比如,144,进行分解,144=2*2*2*2*3*3,即为2的四次方和3的二次方,直接就可以知道它的平方根为2的二次方与3的一次方的乘积,2*2*3=12,故答案为12 ...

怎么算数学题的算术平方根
1、一般地说,若一个非负数x的平方等于a,即x²=a,则这个数x叫做a的算术平方根。2、举例来说:9的平方根为±3 ;9的算术平方根为3,正数的平方根都是前面加±,算术平方根全部都是非负数(0也在内,0的算数平方根为0)。3、对于本题来说,1-100的算数平方根计算如下:√1 = 1 ...

怎样简便计算平方根?
因数法化简平方根 1、如果该数字是偶数,除以2。寻找一个数的因数意味着寻找一切可以通过相乘得到该数字的数字,它可以帮助你化简平方根。如果该数字是偶数,那么你可以做的第一件事就是除以2。在这个例子中, √98变成√(2x49),因为98除以2为49。如果你的数字不能被2整除,尝试3,4,5,依此类...

算术平方根怎么算
算术平方根的计算方法 1.将被开方数的整数部分从个位起向左每隔两位划为一段,用撇号分开(竖式中的11'56),分成几段,表示所求平方根是几位数;2.根据左边第一段里的数,求得平方根的最高位上的数(竖式中的3);3.从第一段的数减去最高位上数的平方,在它们的差的右边写上第二段数组成第...

怎样快速计算出一个数的平方根立方根?
快速计算平方根的公式:20m+n;譬如求72162的平方根:要从个位开始将它分块,每两位一块,即7,21,62这样分。1、首先开始试商,从最高为试起,先来7,思考什么数的平方小于7,明显是2。然后用7减去2的平方,得出的数字3为余数,将要在下一步与后两位数字合起来用来进行下一步运算。2、第二步...

赞皇县19487744021: 怎样计算一个数的平方根? -
父洋羚羊:[答案] 方法一,用计算器 方法二,用二分逼近法,比如计算5的平方根,那么2^2=4,3^2=9,可以知道√5在2和3之间,而后计算2.5^2=6.25>5,可以知道√5在2到2.5之间,不断重复这个过程可以计算出√5任意位小数. 方法三,牛顿迭代法,参考任意计算...

赞皇县19487744021: 一个数的平方根怎么求 -
父洋羚羊: 用我自己的体会和你说吧!一个数是可以拆成两个相同的数的乘积,比如4=2*2,然而平方根就是这两个相同的数,因此4的平方根就是2,再举个例子就是16=4*4,所以16的平方根就是4.要是您还有什么不明白可以继续追问哈!

赞皇县19487744021: 怎么算随便一个数的平方根? -
父洋羚羊: 这个是大学要学的东西,平方根的计算方法计算方法: 我们用a来表示A的平方根,方程x-a=0的解就为A的平方根a.两边平方后有:x*x-2ax+A=0,因为x不等于0,两边除以x有:x-2a+A/x=0、a=(x+A/x)/2所以你只需设置一个约等于(x+A/x)/2的...

赞皇县19487744021: 怎么算一个数的平方根? -
父洋羚羊:[答案] 从最小的基数开始除(2 3 5 7) 有几个除几个 除到不能除为止 比如说50 50除以2得25 25除以5得5 那么30的平方根就是正负5根号2 再比如说12 12除以2得六 六除2得三 所以12的平方根就是正负2根号3 不懂可以问我哈

赞皇县19487744021: 数学上的平方根该怎么算? -
父洋羚羊: 有一种笔算开平方的办法:⒈从个位起向左每隔两位为一节,若带有小数从小数点起向右每隔两位一节,用“,”号将各节分开;⒉求不大于左边第一节数的完全平方数,为“商”;⒊从左边第一节数里减去求得的商,在它们的差的右边写上第二节数作为第一个余数;⒋把商乘以20,试除第一个余数,所得的最大整数作试商(如果这个最大整数大于或等于10,就用9或8作试商);⒌用商乘以20加上试商再乘以试商.如果所得的积小于或等于余数,就把这个试商写在商后面,作为新商;如果所得的积大于余数,就把试商逐次减小再试,直到积小于或等于余数为止.

赞皇县19487744021: 怎么快速求出一个数的平方根?如果那样算不就算死了! -
父洋羚羊:[答案] 1、要先记住20以内数的平方值, 2、把数化成*(10^2)^n的形式, 3、插值法求数的平方根. 例:√5000 5000=50*10^2 7^2=49,7.1^2=50.41, 7.05^2=49.7025, 7.07^2=49.9848, 7.08^2=50.1264, √5000约等于70.7.

赞皇县19487744021: 怎么求一个数的平方根,举3个例子,不用算,只要简单讲一下就行了 -
父洋羚羊: 利用平方运算求平方根. 如:因为(±2)²=4 所以4的平方根是±2 再如:因为(±3)²=9 所以9的平方根是±3

赞皇县19487744021: 怎么快速求出一个数的平方根? -
父洋羚羊: 对这个数进行分解,看它能由哪些数字相乘得到,然后再看这些约数之间的关系,就可以得到平方根比如,144,进行分解,144=2*2*2*2*3*3,即为2的四次方和3的二次方,直接就可以知道它的平方根为2的二次方与3的一次方的乘积,2*2*3=12,故答案为12

赞皇县19487744021: 怎么求一个数的平方根,举3个例子,不用算, -
父洋羚羊:[答案] 利用平方运算求平方根. 如:因为(±2)²=4 所以4的平方根是±2 再如:因为(±3)²=9 所以9的平方根是±3

赞皇县19487744021: 如何快速计算平方根 -
父洋羚羊: 比如136161这个数字,首先找到一个和136161的平方根比较接近的数,任选一个,比方说300到400间的任何一个数,这里选350,作为代表. 先计算0.5(350+136161/350),结果为369.5.然后再计算0.5(369.5+136161/369.5)得到369.0003,...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网