问题描述
为什么朱莉娅会发生这种情况?
我的输入是
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