我正在努力了解如何正确使用BigInt
。在我看来,当BigInt
或Int64
不够时,应该使用Int128
,显然BigInt
使用任意精度算术(我不知道)。
假设我想计算一些大数的阶乘,例如30.我不知道存储factorial(30)
需要多少位,但两者都
test = Int128
test = factorial(30)
和
test = BigInt
test = factorial(30)
产生-8764578968847253504
,这显然是不正确的。
根据Julia lang文档,似乎通常的数学运算符是为这种类型定义的(BigInt),结果被提升为BigInt
。因此,我没有看到我做错了什么,我显然误解了一些事情。希望你们中的一些人可能对我有一个解释:)
PS:如果有话要说,我正在运行64位版本的Windows 7
答案 0 :(得分:8)
factorial
将计算与其参数类型相同的结果,因此
test = factorial(BigInt(30))
可行,将在整个计算过程中使用BigInt
。
test = BigInt(factorial(30))
无法工作,将已经溢出的Int结果转换为BigInt。
test = BigInt(factorial(BigInt(30)))
可行,但外部BigInt是多余的,因为结果已经是BigInt。
您编写的代码
test = BigInt
test = factorial(30)
基本上没有意义。你说
根据Julia lang的文档,似乎是平常的 数学运算符是为这种类型(BigInt)定义的 结果被提升为BigInt。
所以我猜你认为这意味着"结果应该是BigInt",但它并没有。它将类型BigInt
分配给变量测试,然后在factorial
字面值上计算Int
。然后将其存储在test
中,压缩先前的值,即{ {1}}。也许请查看手册的“类型”部分。 Julia在溢出时不会自动将BigInt
提升为Ints
- 您需要以BigInts
开头。这是出于性能(和其他)原因。
大多数操作都是在BigInt
s上定义的 - 只有一些线性代数操作(如特征值)可能不是。只需将您的号码更改为BigInt
一次,它就会在整个计算过程中传播。大多数人永远不会需要BigInt
- 往往只会在研究环境中出现。 BigInt
(与平台整数大小相同,因此计算机上为Int
)变得非常大 - 而且速度很快。
答案 1 :(得分:0)
我想在这个答案的前面加上我对Julia一无所知的断言,但是在https://docs.julialang.org/en/v1/manual/integers-and-floating-point-numbers/#Arbitrary-Precision-Arithmetic-1阅读文档可以看出他们使用factorial(BigInt(40))
,所以显式演员似乎是必需的。
尝试factorial(BigInt(30))
,看看是否能产生预期结果。
此外,从该页面开始:
但是,在上面的原始类型之间键入提升 BigInt / BigFloat不是自动的,必须明确说明。
所以我会尝试3件事,看看有什么作用:
test = factorial(BigInt(30))
test = BigInt(factorial(30))
test = BigInt(factorial(BigInt(30)))
答案 2 :(得分:0)
有关任意精度数学的相关问题。请注意,我只花了两天时间尝试使用Julia语言。查看此帖子后,我添加了BigInt铸件,该铸件又打印出一个数字。我必须丢失一些东西,因为它仍然无法执行,就好像它对所需的所有计算都使用了任意精度。我还必须添加try / catch,因为ismersenneprime函数不是Merseene质数时会引发错误。根据文档,我认为应该返回true或false。
# Perfect numbers are 2^(p-1)x(2^p-1) if 2^p-1 is Mersenne prime.
using Compat
using Primes
limit = 1000000
for p = 1:limit
perfect = BigInt(2^(p-1))*(BigInt(2^p)-1)
try
if ismersenneprime(BigInt(2^p)-1)
println("$p $perfect")
end
catch e
# println(e)
end
end
2 6
3 28
5 496
7 8128
13 33550336
17 8589869056
19 137438691328
31 2305843008139952128
61 2658455991569831744654692615953842176