了解BigInt的使用

kip*_*820 6 bigint julia

我很难理解如何BigInt正确使用.在我看来,应该使用BigInt何时Int64Int128不够,并且显然BigInt使用任意精度算术(我不知道).

假设我想计算一些大数的阶乘,例如30.我不知道需要存储多少位factorial(30)但两者都要

test = Int128
test = factorial(30)
Run Code Online (Sandbox Code Playgroud)

test = BigInt
test = factorial(30)
Run Code Online (Sandbox Code Playgroud)

产生-8764578968847253504明显不正确的产品.

根据Julia lang文档,似乎通常的数学运算符是为这种类型定义的(BigInt),结果被提升为a BigInt.因此,我没有看到我做错了什么,我显然误解了一些事情.希望你们中的一些人可能对我有一个解释:)

PS:如果有话要说,我正在运行64位版本的Windows 7

Iai*_*ing 11

factorial 将计算与其参数类型相同的结果,所以

test = factorial(BigInt(30))  
Run Code Online (Sandbox Code Playgroud)

将工作,将使用BigInt整个计算.

test = BigInt(factorial(30))
Run Code Online (Sandbox Code Playgroud)

无法工作,将已经溢出的Int结果转换为BigInt.

test = BigInt(factorial(BigInt(30)))
Run Code Online (Sandbox Code Playgroud)

会工作,但外部BigInt是多余的,因为结果已经是一个BigInt.

你写的代码

test = BigInt
test = factorial(30)
Run Code Online (Sandbox Code Playgroud)

基本上没有意义.你说

根据Julia lang文档,似乎通常的数学运算符是为这种类型定义的(BigInt),结果被提升为BigInt.

所以我猜你认为这意味着"结果应该是一个BigInt",但事实并非如此.它将类型分配给BigInt变量测试,然后factorialInt文字30 上计算.然后将其存储在中test,压缩先前的值,即BigInt.也许请查看手册的"类型"部分.Julia不会自动提升IntsBigInts溢出 - 你需要从一开始BigInt.这是出于性能(和其他)原因.

大多数操作都是在BigInts 上定义的 - 只有一些线性代数操作(如特征值)可能不是.只需将您的号码更改为BigInt一次,它将在整个计算过程中传播.大多数人永远不会需要BigInts - 往往只会在研究环境中出现.Int(这与平台整数大小相同,所以Int64在你的计算机上),变得非常大 - 而且速度很快.