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

问题描述

为什么朱莉娅会发生这种情况?

我的输入是

A = []
for i = 17:21
    t = 1/(10^(i))
    push!(A,t)
end
return(A)

输出为:

5-element Array{Any,1}:
  1.0e-17
  1.0e-18
 -1.1838881245526248e-19
  1.2876178137472069e-19
  2.5800991659088344e-19

我观察到

A[3]>0
false

我想找到对Julia起作用为0的数字,但是我发现了这个数字,不明白。

解决方法

此问题的原因是当您有i = 19时,请注意:

julia> 10^19
-8446744073709551616

,它与浮点数无关,但是由Int64溢出引起的。

这是将按您期望的方式运行的代码。使用10.0代替10,因为10.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

或使用通过BigInt创建的高精度big(10)类型

julia> A=[]
Any[]

julia> for i=17:21
       t=1/(big(10)^(i))
       push!(A,1}:
 9.999999999999999999999999999999999999999999999999999999999999999999999999999967e-18
 9.999999999999999999999999999999999999999999999999999999999999999999999999999997e-19
 9.999999999999999999999999999999999999999999999999999999999999999999999999999997e-20
 1.000000000000000000000000000000000000000000000000000000000000000000000000000004e-20
 9.999999999999999999999999999999999999999999999999999999999999999999999999999927e-22

您可以在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

最后找到最小的正Float64数,使用:

julia> nextfloat(0.0)
5.0e-324

julia> eps(0.0)
5.0e-324