漢語釋義
數學術語。求方根的運算。對“乘方”而言。
《
周髀算經》卷上“勾股圓方圖” 漢 趙君卿 註:“勾股各自乘,並之為弦實,開方除之,即弦也。”
見方。
《
南史·到溉傳》:“遭母憂,居喪盡禮。所處廬開方四尺,毀瘠過人。”
開藥方。也說開方子。
《再生緣》第五七回:“從此下官拋棄了,再不去,開方診脈作醫生。”
魯迅 《自序》:“因為開方的醫生是最有名的,以此所用的藥引也奇特。”
謝覺哉 《不惑集·》:“﹝我﹞很小就知道中醫開方子,允許寫白子(即簡字或錯用字),叫‘藥白眼’。”
求算面積。
《
明史·食貨志一》:“ 萬曆 六年,帝用大學士 張居正 議,天下田畝通行丈量,限三載竣事。用開方法,以徑圍乘除,畸零截補。於是豪猾不得欺隱,里甲免賠累,而小民無虛糧。”
清
魏源 《
聖武記》卷六:“ 利瑪竇 、 南懷仁諸地圖,開方計里,眉燦星臚。”
清
馮桂芬 《繪地圖儀》:“今 江 南州縣有魚鱗冊,猶沿其制,惟有明以前,繪圖不知計里開方之法,圖與地不能密合,無甚足用。”
方根
數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 九等於三乘三
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位數字)。公式:
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.按照公式:
這種方法可以自動調節,第一步與第三步取值偏大,但是計算出來以後輸出值會自動轉小;第二步,第四步輸入值偏小,輸出值自動轉大。
=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));}