Skip to content

Commit bdbd2fa

Browse files
authored
Merge pull request #56 from JuliaMath/teh/more_promote
Improve consistency of promote
2 parents 4f81c47 + 7870701 commit bdbd2fa

4 files changed

Lines changed: 33 additions & 8 deletions

File tree

src/FixedPointNumbers.jl

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,14 @@ import Base: ==, <, <=, -, +, *, /, ~,
1212
div, fld, rem, mod, mod1, rem1, fld1, min, max, minmax,
1313
start, next, done, r_promote, reducedim_init
1414

15+
if VERSION <= v"0.5.0-dev+755"
16+
macro pure(ex)
17+
nothing
18+
end
19+
else
20+
using Base: @pure
21+
end
22+
1523
using Compat
1624

1725
# T => BaseType

src/ufixed.jl

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ rawone(v) = reinterpret(one(v))
4242
# Conversions
4343
convert{T<:UFixed}(::Type{T}, x::T) = x
4444
convert{T1,T2,f}(::Type{UFixed{T1,f}}, x::UFixed{T2,f}) = UFixed{T1,f}(convert(T1, x.i), 0)
45-
function convert{T,f}(::Type{UFixed{T,f}}, x::UFixed)
45+
function convert{T,T2,f}(::Type{UFixed{T,f}}, x::UFixed{T2})
4646
U = UFixed{T,f}
4747
y = round((rawone(U)/rawone(x))*reinterpret(x))
4848
(0 <= y) & (y <= typemax(T)) || throw_converterror(U, x)
@@ -82,8 +82,14 @@ sizeof{T<:UFixed}(::Type{T}) = sizeof(rawtype(T))
8282
abs(x::UFixed) = x
8383

8484
# Arithmetic
85-
@generated function floattype{U<:UFixed}(::Type{U})
86-
eps(U) < eps(Float32) ? :(Float64) : :(Float32)
85+
if VERSION <= v"0.5.0-dev+755"
86+
@generated function floattype{T,f}(::Type{UFixed{T,f}})
87+
f>22 ? :(Float64) : :(Float32)
88+
end
89+
else
90+
@pure function floattype{T,f}(::Type{UFixed{T,f}})
91+
f>22 ? Float64 : Float32
92+
end
8793
end
8894

8995
(-){T<:UFixed}(x::T) = T(-reinterpret(x), 0)
@@ -158,12 +164,10 @@ function decompose(x::UFixed)
158164
end
159165

160166
# Promotions
161-
promote_rule{T<:UFixed}(::Type{T}, ::Type{Float32}) = Float32
162-
promote_rule{T<:UFixed}(::Type{T}, ::Type{Float64}) = Float64
167+
promote_rule{T<:UFixed,Tf<:AbstractFloat}(::Type{T}, ::Type{Tf}) = promote_type(floattype(T), Tf)
163168
promote_rule{T<:UFixed, R<:Rational}(::Type{T}, ::Type{R}) = R
164-
@generated function promote_rule{T<:UFixed, Ti<:Union{Signed,Unsigned}}(::Type{T}, ::Type{Ti})
165-
Tp = eps(convert(Float32, typemax(Ti))) > eps(T) ? Float64 : Float32
166-
:( $Tp )
169+
function promote_rule{T<:UFixed, Ti<:Union{Signed,Unsigned}}(::Type{T}, ::Type{Ti})
170+
floattype(T)
167171
end
168172
@generated function promote_rule{T1,T2,f1,f2}(::Type{UFixed{T1,f1}}, ::Type{UFixed{T2,f2}})
169173
f = max(f1, f2) # ensure we have enough precision

test/runtests.jl

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
using FixedPointNumbers, Base.Test
2+
3+
if VERSION >= v"0.5.0"
4+
@test isempty(detect_ambiguities(FixedPointNumbers, Base, Core))
5+
end
6+
17
for f in ["ufixed.jl", "fixed.jl"]
28
println("Testing $f")
39
include(f)

test/ufixed.jl

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,13 @@ end
197197
@test @inferred(promote(UFixed{UInt8,7}(0.197), UFixed{UInt8,4}(0.8))) ===
198198
(UFixed{UInt16,7}(0.197), UFixed{UInt16,7}(0.8))
199199

200+
@test promote_type(UFixed8,Float32,Int) == Float32
201+
@test promote_type(UFixed8,Int,Float32) == Float32
202+
@test promote_type(Int,UFixed8,Float32) == Float32
203+
@test promote_type(Int,Float32,UFixed8) == Float32
204+
@test promote_type(Float32,Int,UFixed8) == Float32
205+
@test promote_type(Float32,UFixed8,Int) == Float32
206+
200207
# Show
201208
x = 0xaauf8
202209
iob = IOBuffer()

0 commit comments

Comments
 (0)