将地球上的原子分配给Julia中的变量

时间:2018-10-15 01:59:47

标签: julia

在Python 3.6中,以下工作为变量分配了地球上原子的估计:

In[6]: atoms_in_earth = 10**50
In[7]: atoms_in_earth
Out[7]: 100000000000000000000000000000000000000000000000000

但是,以下内容在Julia 1.0.0中不起作用:

julia> atoms_in_earth = 10^50
-5376172055173529600

julia> atoms_in_earth = BigInt(10^50)
-5376172055173529600

julia> atoms_in_earth = BigFloat(10^50)
-5.3761720551735296e+18

julia> atoms_in_earth = big(10^50)
-5376172055173529600

julia> atoms_in_earth = big"10^50"
ERROR: ArgumentError: invalid number format 10^50 for BigInt or BigFloat
Stacktrace:
 [1] top-level scope at none:0

我能够使这些方法起作用:

julia> atoms_in_earth = big"1_0000000000_0000000000_0000000000_0000000000_0000000000"
100000000000000000000000000000000000000000000000000

julia> float(ans)
1.0e+50

julia> atoms_in_earth = parse(BigInt, '1' * '0'^50)
100000000000000000000000000000000000000000000000000

julia> float(ans)
1.0e+50

我希望朱莉娅(Julia)有一种更简单的方法。

我想念什么?

2 个答案:

答案 0 :(得分:5)

Julia默认使用本地整数,这些整数可能会溢出。 Python默认情况下使用 big 整数(具有任意精度,它的大小限制取决于可用内存的数量),并且不会溢出(但因此会更慢)。

您的第一个示例溢出Int64

julia> atoms_in_earth = 10^50
-5376172055173529600

在将它们转换为bigs之前,您的第二个,第三个和第四个示例已经溢出:

julia> atoms_in_earth = BigInt(10^50)
-5376172055173529600

julia> atoms_in_earth = BigFloat(10^50)
-5.3761720551735296e+18

julia> atoms_in_earth = big(10^50)
-5376172055173529600

您的第五个示例不是有效的大字面量:

julia> atoms_in_earth = big"10^50"
ERROR: ArgumentError: invalid number format 10^50 for BigInt or BigFloat

但是您可以创建一个小数作为BigInt,在您的示例10中,任何进一步的运算都会升级为 big 算术,形式如下:

julia> x = 10
10

julia> typeof(x)
Int64

julia> x = BigInt(10)
10

julia> typeof(x)
BigInt

julia> big(10) == big"10" == big(10)
true

julia> y = x^50
100000000000000000000000000000000000000000000000000

julia> typeof(y)
BigInt

在这种情况下,在计算50之前,BigInt也被提升为x^50,从而最终产生BigInt

julia> BigInt(10)^50 == big"10"^50 == big(10)^50
true

答案 1 :(得分:1)

这有效:

julia> atoms_in_earth = big"1e50"
1.0e+50

julia> typeof(ans)
BigFloat