@@ -95,11 +95,10 @@ julia> clamp.([11, 8, 5], 10, 6) # an example where lo > hi
9595 10
9696```
9797"""
98- clamp (x:: X , lo:: L , hi:: H ) where {X,L,H} =
99- ifelse (x > hi, convert (promote_type (X,L,H), hi),
100- ifelse (x < lo,
101- convert (promote_type (X,L,H), lo),
102- convert (promote_type (X,L,H), x)))
98+ function clamp (x:: X , lo:: L , hi:: H ) where {X,L,H}
99+ T = promote_type (X, L, H)
100+ return (x > hi) ? convert (T, hi) : (x < lo) ? convert (T, lo) : convert (T, x)
101+ end
103102
104103"""
105104 clamp(x, T)::T
@@ -120,7 +119,14 @@ julia> trunc(Int, 4pi^2)
12011939
121120```
122121"""
123- clamp (x, :: Type{T} ) where {T<: Integer } = clamp (x, typemin (T), typemax (T)) % T
122+ function clamp (x, :: Type{T} ) where {T<: Integer }
123+ # delegating to clamp(x, typemin(T), typemax(T)) would promote types
124+ # this way, we avoid unnecessary conversions
125+ # think of, e.g., clamp(big(2) ^ 200, Int16)
126+ lo = typemin (T)
127+ hi = typemax (T)
128+ return (x > hi) ? hi : (x < lo) ? lo : convert (T, x)
129+ end
124130
125131
126132"""
0 commit comments