为什么 Julia 会发生这种情况?
我的输入是
A = []
for i = 17:21
t = 1/(10^(i))
push!(A, t)
end
return(A)
Run Code Online (Sandbox Code Playgroud)
输出是:
5-element Array{Any,1}:
1.0e-17
1.0e-18
-1.1838881245526248e-19
1.2876178137472069e-19
2.5800991659088344e-19
Run Code Online (Sandbox Code Playgroud)
我观察到
A[3]>0
false
Run Code Online (Sandbox Code Playgroud)
我想找到对 0 Julia 起作用的数字,但我找到了这个但不明白。
出现此问题的原因是当您有 时i = 19,请注意:
julia> 10^19
-8446744073709551616
Run Code Online (Sandbox Code Playgroud)
它与浮点数无关,而是由Int64溢出引起的。
这是可以按您预期工作的代码。要么使用10.0而不是10as10.0是一个Float64值:
julia> A=[]
Any[]
julia> for i=17:21
t=1/(10.0^(i))
push!(A,t)
end
julia> A
5-element Array{Any,1}:
1.0e-17
1.0e-18
1.0e-19
1.0e-20
1.0e-21
Run Code Online (Sandbox Code Playgroud)
或使用使用BigInt创建的高精度类型big(10)
julia> A=[]
Any[]
julia> for i=17:21
t=1/(big(10)^(i))
push!(A,t)
end
julia> A
5-element Array{Any,1}:
9.999999999999999999999999999999999999999999999999999999999999999999999999999967e-18
9.999999999999999999999999999999999999999999999999999999999999999999999999999997e-19
9.999999999999999999999999999999999999999999999999999999999999999999999999999997e-20
1.000000000000000000000000000000000000000000000000000000000000000000000000000004e-20
9.999999999999999999999999999999999999999999999999999999999999999999999999999927e-22
Run Code Online (Sandbox Code Playgroud)
你可以在这里找到更多关于这个的讨论https://docs.julialang.org/en/v1/manual/integers-and-floating-point-numbers/#Overflow-behavior。
例如,请注意(如果不知道溢出,您可能会感到惊讶):
julia> x = typemin(Int64)
-9223372036854775808
julia> x^2
0
julia> y = typemax(Int64)
9223372036854775807
julia> y^2
1
Run Code Online (Sandbox Code Playgroud)
最后找到最小的正Float64数使用:
julia> nextfloat(0.0)
5.0e-324
Run Code Online (Sandbox Code Playgroud)
或者
julia> eps(0.0)
5.0e-324
Run Code Online (Sandbox Code Playgroud)