跳转到内容

模块:BigNumber/doc

本页使用了标题或全文手工转换
维基百科,自由的百科全书

这是Module:BigNumber的文档页面

以百万进制运作的大数运算系统(或称高精度计算)。当中也包含了大数运算进制变换系统。目前支持加法、减法、乘法、除法与整数幂次

使用方法

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对象:less(other)
比较bigint对象的值是否小于other的值
参数:
  • other:要和自身比较的另一个数,可以是数字或其他bigint对象
bigint对象:lessequal(other)
比较bigint对象的值是否小于等于other的值
参数:
  • other:要和自身比较的另一个数,可以是数字或其他bigint对象
bigint对象:clone()
制作bigint对象的副本
bigint对象:divsmall(other)
计算bigint对象与一般数字相除的商
参数:
  • other:被除数。只能是数字,不可以是bigint对象
bigint对象:inverse(precision)
计算bigint对象所代表的值之倒数
参数:
  • precision:运算精度
bigint对象:length()
获取这个bigint对象的位数(含非整数部分)。可用于计算倒数时的精度位数
bigint对象:intlength()
获取这个bigint对象整数部分的位数
.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函数库
三角函sincostancotsinhcoshtanhcothasinacosatanatan2acotasinhacoshatanhacoth
这些函数是取同界角后(避免经度丢失)直接调用math函数库的函数。单位是弧度。
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>
例如:
local bigint = require('Module:BigNumber')
print(bigint.convertBase({n = 3.14159265358979, base = 3}))
输出:10.010211012222010(OEIS数列A004602
由于模块本身是大数运算系统,因此若数字过大失去精度的话可以考虑改成以字符串输入:
bigint.convertBase(123456789123456789)→123456789123460000
bigint.convertBase("123456789123456789")→123456789123456789
._FFT(re, im, length, ifft)
执行快速傅里叶变换。在本模块中用于大数乘法。
参数:

模板

搭配{{计算}}使用,仅需将|number class=参数指定为Module:BigNumber.bigintmath即可调用大数运算相关函数。

{{計算| 2^64 | number class=Module:BigNumber.bigintmath}}
→18446744073709551616
对比{{計算| 2^64 }}→1.844674407371e+19
以及{{#expr:2^64 }}→1.844674407371E+19
{{計算| 425731578351266 * 948700000017358 | number class=Module:BigNumber.bigintmath}}
→403891548389235902937021275228
对比{{計算| 425731578351266 * 948700000017358 }}→4.0389154838924e+29
以及{{#expr:425731578351266 * 948700000017358 }}→4.0389154838924E+29
{{計算| factorial(70) | number class=Module:BigNumber.bigintmath}}
→11978571669969891796072783721689098736458938142546425857555362864628009582789845319680000000000000000
对比{{計算| factorial(70) }}→1.197857166997e+100

注意事项

虽然大数运算系统(或称高精度计算)理论上无计算上的上限,但考虑到维基百科伺服器有限制脚本运作时间为10秒(见WP:模板限制)因此也不能运算过大的数;此外幂次的运算是使用传统的一次一次相乘的方法,因此过大的指数也可能导致超过模板运算上限。虽然目前乘法算法已使用傅里叶变换进行加速,但使用此模块时仍应留意性能。

此外,本模块主要是设计给整数的大数运算(Big Integer),但有保留小数运算的能力,尤其是运算除法不整除时,多次的除法会导致小数码数的增长,因而导致计算时间增加,因此若需要做多次除法建议取整,可使用number:setpoint(0).bigintmath.floor(number)(搭配{{计算}}时使用floor(number))来清除小数。

参见