模组:BigNumber/doc
这是Module:BigNumber的文档页面
此页面是Module:BigNumber的模块文档。 此页面可能包含了模板的使用说明、分类和其他内容。 |
此模块文档被引用于约7,500个页面。 为了避免造成大规模的影响,所有对此模块文档的编辑应先于沙盒或测试样例上测试。 测试后无误的版本可以一次性地加入此模块文档中,但是修改前请务必于讨论页发起讨论。 模板引用数量会自动更新。 |
以百万进制运作的大数运算系统(或称高精度计算)。当中也包含了大数运算进制转换系统。目前支援加法、减法、乘法、除法与整数幂次。
使用方法
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)
)来清除小数。