中点を安全に得る
(lo + hi) ÷ 2
lo + hi > typemax(Int)になる場合に意図しない動きになる
lo + (hi - lo) ÷ 2
loとhiが同符号である限りオーバーフローが発生しないことを保証できる 組み込み関数のモジュールの実装を見るとlo + (hi - lo) ÷ 2が採用されている
midpoint(lo::T, hi::T) where T<:Integer = lo + ((hi - lo) >>> 0x01)
This implementation of midpoint is performance-optimized but safe
ソースコードも同じ言語で書かれていると、読みやすくておもしろいあんも.icon
code:jl
midpoint(lo, hi) = lo + ((hi - lo) >>> 0x01)
midpoint_bad(lo, hi) = (lo + hi) ÷ 2
lo = typemax(Int64) - 10
hi = typemax(Int64)
midpoint(lo, hi) # 9223372036854775802
midpoint_bad(lo, hi) # -6