複製鏈接
請複製以下鏈接發送給好友

開方

(數學術語)

鎖定
開方(英文rooting),也叫作開根,指求一個數的方根的運算,為乘方逆運算。在中國古代也指求二次及高次方程(包括二項方程)的正根。
中文名
開方
外文名
rooting
extract a root
外文名
extraction of a root
所屬學科
數學
定    義
求一個數的方根的運算
別    名
開根

開方定義

求一個數的方根的運算,如
示例圖 示例圖
數a的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個n次方根是,k=0,1,2…,n-1。

開方方法

數字4開方後就是2,2就是它開方的結果
這個用兩個相同數字表示一個數的這個數字叫做開方
4=2x2 四等於二乘二
9=3x3 九等於三乘三
16=4x4
25=5x5
36=6x6
49=7x7
64=8x8
81=9x9
100=10x10
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 value
static 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));
}