在阅读julia文档中关于机器精度的介绍时,有一个困惑。按照机器精度的定义,x+eps(x)应该是比x大的下一个可表示的浮点数。进行一下实验,1.0加上一个小于机器精度的数,与1.0进行比较时,结果为false。希望有经验的人帮忙解惑,感谢!
julia> eps(Float32)
1.1920929f-7
julia> 1.1f-7 < ans
true
julia> Float32(1.0) + 1.1f-7 == Float32(1.0)
false
在阅读julia文档中关于机器精度的介绍时,有一个困惑。按照机器精度的定义,x+eps(x)应该是比x大的下一个可表示的浮点数。进行一下实验,1.0加上一个小于机器精度的数,与1.0进行比较时,结果为false。希望有经验的人帮忙解惑,感谢!
julia> eps(Float32)
1.1920929f-7
julia> 1.1f-7 < ans
true
julia> Float32(1.0) + 1.1f-7 == Float32(1.0)
false
julia> Float32(1.0) + 1.1f-7 ≈ Float32(1.0)
true
这个里面是什么逻辑呢?能深入讲讲吗?
如果我给1加上一个比机器精度低一个数量级的数,判断为true。
julia> Float32(1.0) + 1.1f-8 == Float32(1.0)
true
这不是正常的各分一半。
1f0
和 nextfloat(1f0)
之间没有其他浮点数了,所以这个区间 [1f0, nextfloat(1f0)]
对半分割开。
具体的分割点,到底是算前一个数,还是后一个。请参阅 IEEE 标准。
julia> 1f0 == (1f0 + eps(1f0)*0.49f0) < nextfloat(1f0)
true
julia> 1f0 == (1f0 + eps(1f0)*0.50f0) < nextfloat(1f0)
true
julia> 1f0 == (1f0 + eps(1f0)*0.51f0) < nextfloat(1f0)
false
julia> 1f0 < (1f0 + eps(1f0)*0.51f0) == nextfloat(1f0)
true
这个其实就是浮点数的舍入。
还需要考虑舍入模式。
help?> RoundingMode
search: RoundingMode
RoundingMode
A type used for controlling the rounding mode of floating point operations (via rounding/setrounding functions), or
as optional arguments for rounding to the nearest integer (via the round function).
Currently supported rounding modes are:
• RoundNearest (default)
• RoundNearestTiesAway
• RoundNearestTiesUp
• RoundToZero
• RoundFromZero (BigFloat only)
• RoundUp
• RoundDown
感谢回答,豁然开朗~