Indeed, structure from breaking ties to even in Float32(rand(Float64))
is present for all values larger than 2^{-29}, and most pronounced in the first octave between 2^{-29} and 2^{-28}. Notice the 3:1 ratio of values that round to “even” vs. “odd”:
julia> using UnicodePlots
julia> f32s = Float32.([0x1.0p-29 + i * 0x1.0p-53 for i in 0:31]);
julia> histogram(f32s; nbins=length(unique(f32s)))
┌ ┐
[1.86265e-9, 1.86265e-9) ┤████████████████████████▋ 2
[1.86265e-9, 1.86265e-9) ┤████████████▍ 1
[1.86265e-9, 1.86265e-9) ┤█████████████████████████████████████ 3
[1.86265e-9, 1.86265e-9) ┤████████████▍ 1
[1.86265e-9, 1.86265e-9) ┤█████████████████████████████████████ 3
[1.86265e-9, 1.86265e-9) ┤████████████▍ 1
[1.86265e-9, 1.86265e-9) ┤█████████████████████████████████████ 3
[1.86265e-9, 1.86265e-9) ┤████████████▍ 1
[1.86265e-9, 1.86265e-9) ┤█████████████████████████████████████ 3
[1.86265e-9, 1.86265e-9) ┤████████████▍ 1
[1.86265e-9, 1.86265e-9) ┤ 0
[1.86265e-9, 1.86265e-9) ┤█████████████████████████████████████ 3
[1.86265e-9, 1.86265e-9) ┤████████████▍ 1
[1.86265e-9, 1.86265e-9) ┤█████████████████████████████████████ 3
[1.86265e-9, 1.86265e-9) ┤████████████▍ 1
[1.86265e-9, 1.86265e-9) ┤█████████████████████████████████████ 3
[1.86265e-9, 1.86265e-9) ┤████████████▍ 1
[1.86265e-9, 1.86265e-9) ┤████████████▍ 1
[1.86265e-9, 1.86265e-9) ┤ 0
└ ┘
Frequency