模組:BigNumber/doc
此頁面為 Module:BigNumber 的說明文件
此頁面是Module:BigNumber的模組文件。 此頁面可能包含了模板的使用說明、分類和其他內容。 |
此模組文件被參照於約7,400個頁面。 為了避免造成大規模的影響,所有對此模組文件的編輯應先於沙盒或測試樣例上測試。 測試後無誤的版本可以一次性地加入此模組文件中,但是修改前請務必於討論頁發起討論。 模板參照數量會自動更新。 |
以百萬進制運作的大數運算系統(或稱高精度計算)。當中也包含了大數運算進制轉換系統。目前支援加法、減法、乘法、除法與整數冪次。
使用方法
編輯Lua
編輯- .bigint("bignumber", base)
- 以一個指定底數的字串初始化一個大數。底數預設值為10。底數可接受的值與.convertBase函式相同。
- 參數:
- bignumber(大數):要初始化的大數。若未輸入則預設為0。
- base(輸入的底數):輸入值的進位制,預設為10。(參見.convertBase函式的
from
參數)
- 例如:
local bigint = require('Module:BigNumber') print(bigint.bigint("425731578351266") * bigint.bigint("948700000017358"))
- 輸出:403891548389235902937021275228
- 參數:
- 這個函式會返回一個bigint物件。每個bigint都可以互相進行加法、減法、乘法、除法和乘冪運算(乘冪運算的指數不能是bigint物件)
- 每個bigint物件有以下成員函式可供使用:
- bigint物件:equal(other)
- 比較兩個bigint物件的值是否相等
- 參數:
- other:要和自身比較的另一個數,可以是數字或其他bigint物件
- 參數:
- 比較兩個bigint物件的值是否相等
- bigint物件:less(other)
- 比較bigint物件的值是否小於other的值
- 參數:
- other:要和自身比較的另一個數,可以是數字或其他bigint物件
- 參數:
- 比較bigint物件的值是否小於other的值
- bigint物件:lessequal(other)
- 比較bigint物件的值是否小於等於other的值
- 參數:
- other:要和自身比較的另一個數,可以是數字或其他bigint物件
- 參數:
- 比較bigint物件的值是否小於等於other的值
- bigint物件:clone()
- 製作bigint物件的副本
- bigint物件:divsmall(other)
- 計算bigint物件與一般數字相除的商
- 參數:
- other:被除數。只能是數字,不可以是bigint物件
- 參數:
- 計算bigint物件與一般數字相除的商
- bigint物件:inverse(precision)
- 計算bigint物件所代表的值之倒數
- 參數:
- precision:運算精度
- 參數:
- 計算bigint物件所代表的值之倒數
- bigint物件:length()
- 取得這個bigint物件的位數(含非整數部分)。可用於計算倒數時的精度位數
- bigint物件:intlength()
- 取得這個bigint物件整數部分的位數
- bigint物件:equal(other)
- .bigintmath
- 提供支援bigint物件的math函式庫。
- 使用方法
- 使用
.bigintmath
前須先呼叫.bigintmath.init()
初始化方能使用當中的各項函式 - 例如:
local bigint = require('Module:BigNumber') local mymath = bigint.bigintmath.init() print(mymath.abs("-12345"))
- 輸出:12345
- 使用
- 成員函式
- init(base):初始化bigint的math函式庫
- 三角函數(
sin
、cos
、tan
、cot
、sinh
、cosh
、tanh
、coth
、asin
、acos
、atan
、atan2
、acot
、asinh
、acosh
、atanh
、acoth
) - deg(x):弧度轉角度
- rad(x):角度轉弧度
- e:數學常數e
- pi:數學常數圓周率
- huge:無窮大
- abs(x):取絕對值
- sgn(x):取符號函數
- floor(x):取向下取整
- ceil(x):取向上取整
- div(x,y):除法,
x / y
- inverse(x):取倒數,小數點16位精度
- digits(x):取得整數的位數
- sqrt(x):使用牛頓法以大數運算計算平方根,過大的數字可能會需要較長的計算時間
- modf(x):將一數拆成整數部分與小數部分
- fmod(x,y):計算x除以y的餘數,商向零取整
- exp(x):計算
- frexp(x):將x表達為 ,回傳m和e
- ldexp(m, e):計算
- pow(x,y):計算
- log(x):計算 (直接調用math函式庫的函式)
- log(a,x):計算 (直接調用math函式庫的函式)
- log10(x):計算
- factorial(x):計算
- max(x0,x1,x2,...):取得一系列數字的最大值
- min(x0,x1,x2,...):取得一系列數字的最小值
- random(a,b):取[a,b]之間的亂數。若b未輸入則取[1,a]之間的亂數。若皆未輸入則取[0,1)之間的亂數。
- .convertBase("number", base, from, width, precision, sub)
- 將特定進位制的數字轉成以另一個進位制表示。在本模組中用於大數輸入輸出。本函式可模板呼叫。
- 參數:
- number(數字):(必填)須轉換的數字,以字串形式輸入。十進制的數字可直接以數字形式輸入,但需注意過大的數字若以數字的形式輸入可能會丟失精度,應視情況換用字串輸入。
- base(目標底數):目標進位制,可取任意絕對值介於1到9007199254740900之間的所有實數(含負數)、純虛數和高斯整數,可接受非整數的底數,如 進制。支援特殊進制:「!」表示階乘進制、「fibcode」表示斐波那契編碼。預設為10。
- from(原始底數):輸入值的進位制,可取絕對值小於9007199254740900的任意複數,預設為10(如果輸入的數字以「0x」開頭,則預設為16)。
- width(位數補齊):小數點前至少顯示的位數,達不到時會加「0」。
- precision(小數計算最大位數):小數點後的位數,達不到時會加「0」。不填該項會顯示所有位數,但不超過20位數。
- sub(輸出模式):見Template:進制/doc#sub的值。
- prefix:加在輸出值前的維基代碼。number為空時則不加。例如在轉換到十六進制後在前面加上
0x
。 - suffix:加在輸出值後的維基代碼。number為空時則不加。例如在轉換到八進制後在後面加上
<sub>8</sub>
。
- 例如:
- 由於模組本身是大數運算系統,因此若數字過大失去精度的話可以考慮改成以字串輸入:
bigint.convertBase(123456789123456789)
→123456789123460000bigint.convertBase("123456789123456789")
→123456789123456789
- 參數:
- ._FFT(re, im, length, ifft)
- 執行快速傅立葉轉換。在本模組中用於大數乘法。
模板
編輯搭配{{計算}}使用,僅需將|number class=
參數指定為Module:BigNumber.bigintmath
即可呼叫大數運算相關函式。
{{計算|2^64 | number class=Module:BigNumber.bigintmath}}
{{計算|425731578351266 * 948700000017358 | number class=Module:BigNumber.bigintmath}}
{{計算|factorial(70) | number class=Module:BigNumber.bigintmath}}
- →11978571669969891796072783721689098736458938142546425857555362864628009582789845319680000000000000000
- 對比
{{計算|factorial(70) }}
→1.197857166997e+100
- 對比
- →11978571669969891796072783721689098736458938142546425857555362864628009582789845319680000000000000000
注意事項
編輯雖然大數運算系統(或稱高精度計算)理論上無計算上的上限,但考慮到維基百科伺服器有限制指令碼運作時間為10秒(見WP:模板限制)因此也不能運算過大的數;此外冪次的運算是使用傳統的一次一次相乘的方法,因此過大的指數也可能導致超過模板運算上限。雖然目前乘法演算法已使用傅立葉轉換進行加速,但使用此模組時仍應留意效能。
此外,本模組主要是設計給整數的大數運算(Big Integer),但有保留小數運算的能力,尤其是運算除法不整除時,多次的除法會導致小數位數的增長,因而導致計算時間增加,因此若需要做多次除法建議取整,可使用number:setpoint(0)
或.bigintmath.floor(number)
(搭配{{計算}}時使用floor(number)
)來清除小數。