基本介紹
- 中文名:開方
- 外文名:rooting
- 解釋:一個數的方根的運算
- 類別:數學(代數)
- 適用範圍:數理科學
漢語釋義,方根,方法,電腦程式代碼,
漢語釋義
方根
數a的n(n為自然數)次方根指的是n方冪等於a的數,也就是適合b的n次方=a的數b。例如16的4次方根有2和-2。一個數的2次方根稱為平方根;3次方根稱為立方根。各次方根統稱為方根。求一個指定的數的方根的運算稱為開方。一個數有多少個方根,這個問題既與數的所在範圍有關,也與方根的次數有關。在實數範圍內,任一實數的奇數次方根有且僅有一個,例如8的3次方根為2,-8的 3次方根為-2 ;正實數的偶數次方根是兩個互為相反數的數,例如16的4次方根為2和-2;負實數不存在偶數次方根;零的任何次方根都是零。在複數範圍內,無論n是奇數或偶數,任一個非零的複數的n次方根都有n個。如果複數,,那么它的n個n次方根是,k=0,1,2…,n-1。
方法
數字4開方後就是2,2就是它開方的結果
這個用兩個相同數字表示一個數的這個數字叫做開方
這個用兩個相同數字表示一個數的這個數字叫做開方
4=2x2 四等於二乘二
9=3x3 九等於三乘三
9=3x3 九等於三乘三
16=4x4
25=5x5
36=6x6
49=7x7
64=8x8
64=8x8
81=9x9
100=10x10
2,3,4,5,6,7,8,9,10就是4和9,16,25,36,49,64,81,100開方後的數
2,3,4,5,6,7,8,9,10就是4和9,16,25,36,49,64,81,100開方後的數
關於任意數開任意次方的公式:設被開方數為A,開次方數為B。C為變數
首次C取值為1,帶入A,B常量計算結果,並用計算結果值替換公式中的變數 C。再次計算結果,再次替換,當C=公式計算結果值,此時C即為根。循環步驟受開方數字長度影響,此法也可筆算進行。採用的是牛頓疊代法。且 A、B 可為小數,分數,負數,此法為逐次逼近法。可簡單的實現編程。但是注意:不能計算負數開偶數次方。
下面為:代入法
1、把被開方的整數部分從個位起向左每隔n位為一節,用撇號分開;
2、根據左邊第一節里的數,求得開n次算術根的最高位上的數,假設這個數為a;
3、從第一節的數減去求得的最高位上數的n次方,在它們的差的右邊寫上第二節數作為第一個餘數;
4、用第一個餘數除以,所得的整數部分試商(如果這個最大整數大於或等於10,就用9做試商);
5、設試商為b。如果小於或等於餘數,這個試商就是n次算術根的第二位;如果大於餘數,就把試商逐次減1再試,直到小於或等於餘數為止。
6、用同樣的方法,繼續求n次算術跟的其它各位上的數(如果已經算了k位數數字,則a要取為全部k位數字)。公式:
例如,開立方,A=5,即k=3.公式:
5介於 至 之間(1的3次方=1,2的3次方=8)
可以取1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8,1.9,2.0都可以。例如我們取2.0.按照公式:
第一步:。輸入值大於輸出值,負反饋;
即,,,,取2位數值,即1.7。
第二步:.。輸入值小於輸出值,正反饋;
即,,,。取3位數,比前面多取一位數。
第三步:。輸入值大於輸出值,負反饋
第四步:.輸入值小於輸出值,正反饋;
這種方法可以自動調節,第一步與第三步取值偏大,但是計算出來以後輸出值會自動轉小;第二步,第四步輸入值偏小,輸出值自動轉大。 =1.7099.
電腦程式代碼
對於任意實數的開方,可以使用切線法得到其任意精度的結果,切線法的疊代公式為:
取任意初始值,以上疊代序列將會收斂:
實際套用中一般取初始值為稍微大的實數,這樣可以加快序列的收斂速度。
c語言代碼如下:
// 2015-12-24// By: ChenYu#include "math.h"#include "stdio.h"#define ABS(a) ((a)<0?-(a):(a))#ifdef _WIN32 typedef unsigned __int64 uint64;#else typedef unsigned long long uint64;#endif// calculate a approximate valuestatic double calcInitRoot(double x, int n){ const uint64 exptMask=((uint64)1<<11)-1; const uint64 fracMask=((uint64)1<<52)-1; uint64 xInt=*(uint64*)&x; int xExpt=(int)((xInt>>52)&exptMask)-1023; xInt=((uint64)((xExpt+1024*n-1)/n)<<52)+(xInt&fracMask)/n; return *(double*)&xInt;}double calcRoot(double x, int n){ int i, j, s=1-((x<0)<<(n&1)); double a=ABS(x); double x1, x0=calcInitRoot(a, n); double err=x0*1e-14; if(x==0) return 0; for(i=1; i<50; i++) { double xn=1; for(j=0; j<n-1; j++) xn*=x0; x1=((n-1)*x0*xn+a)/(xn*n); // printf("x%d=%.14f\n", i, x1); if(ABS(x1-x0)<=err) break; x0=x1; } return s*x1;}void main(){ double x=-31141.592653589793; int n=11; double y=calcRoot(x, n); printf("root(%g,%d)=%+.14f\n", x, n, y); printf("root(%g,%d)=%+.14f\n", x, n, pow(ABS(x), 1.0/n));}