我想找到对 0 Julia 起作用的数字 - 我的意思是最接近的 0 数字

Ala*_*tor 2 underflow julia

为什么 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 起作用的数字,但我找到了这个但不明白。

Bog*_*ski 5

出现此问题的原因是当您有 时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)