关于julia的机器精度

在阅读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

这不是正常的各分一半。
1f0nextfloat(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
3 个赞

感谢回答,豁然开朗~