@@ -26,7 +26,7 @@ signbits(::Type{X}) where {X <: Normed} = 0
2626
2727for T in (UInt8, UInt16, UInt32, UInt64)
2828 io = IOBuffer ()
29- for f in 1 : sizeof (T)* 8
29+ for f in 1 : bitwidth (T)
3030 sym = Symbol (String (take! (showtype (io, Normed{T,f}))))
3131 @eval begin
3232 const $ sym = Normed{$ T,$ f}
@@ -39,7 +39,7 @@ reinterpret(::Type{Normed{T,f}}, x::T) where {T <: Unsigned,f} = Normed{T,f}(x,
3939
4040zero (:: Type{Normed{T,f}} ) where {T,f} = Normed {T,f} (zero (T),0 )
4141function oneunit (:: Type{T} ) where {T <: Normed }
42- T (typemax (rawtype (T)) >> (8 * sizeof (T)- nbitsfrac (T)), 0 )
42+ T (typemax (rawtype (T)) >> (bitwidth (T)- nbitsfrac (T)), 0 )
4343end
4444one (:: Type{T} ) where {T <: Normed } = oneunit (T)
4545zero (x:: Normed ) = zero (typeof (x))
@@ -76,36 +76,34 @@ function _convert(::Type{U}, x::Float16) where {T, f, U <: Normed{T,f}}
7676 end
7777 return _convert (U, Float32 (x))
7878end
79- function _convert (:: Type{U } , x:: Tf ) where {T, f, U <: Normed{T,f} , Tf <: Union{Float32, Float64} }
80- if T == UInt128 && f == 53
81- 0 <= x <= Tf (3.777893186295717e22 ) || throw_converterror (U , x)
79+ function _convert (:: Type{N } , x:: Tf ) where {T, f, N <: Normed{T,f} , Tf <: Union{Float32, Float64} }
80+ if T === UInt128 && f == 53
81+ 0 <= x <= Tf (3.777893186295717e22 ) || throw_converterror (N , x)
8282 else
83- 0 <= x <= Tf ((typemax (T)- rawone (U ))/ rawone (U )+ 1 ) || throw_converterror (U , x)
83+ 0 <= x <= Tf ((typemax (T)- rawone (N ))/ rawone (N )+ 1 ) || throw_converterror (N , x)
8484 end
8585
86- significand_bits = Tf == Float64 ? 52 : 23
87- if f <= (significand_bits + 1 ) && sizeof (T) * 8 < significand_bits
88- return reinterpret (U, unsafe_trunc (T, round (rawone (U) * x)))
86+ if f <= (significand_bits (Tf) + 1 ) && bitwidth (T) < significand_bits (Tf)
87+ return reinterpret (N, unsafe_trunc (T, round (rawone (N) * x)))
8988 end
9089 # cf. the implementation of `frexp`
91- Tw = f < sizeof (T) * 8 ? T : widen1 (T)
92- bits = sizeof (Tw) * 8 - 1
93- xu = reinterpret (Tf == Float64 ? UInt64 : UInt32, x)
94- k = Int (xu >> significand_bits)
95- k == 0 && return zero (U) # neglect subnormal numbers
96- significand = xu | (one (xu) << significand_bits)
97- yh = unsafe_trunc (Tw, significand) << (bits - significand_bits)
98- exponent_bias = Tf == Float64 ? 1023 : 127
99- ex = exponent_bias - k + bits - f
90+ Tw = f < bitwidth (T) ? T : widen1 (T)
91+ bits = bitwidth (Tw) - 1
92+ xu = reinterpret (Unsigned, x)
93+ k = Int (xu >> significand_bits (Tf))
94+ k == 0 && return zero (N) # neglect subnormal numbers
95+ significand = xu | (oneunit (xu) << significand_bits (Tf))
96+ yh = unsafe_trunc (Tw, significand) << (bits - significand_bits (Tf))
97+ ex = exponent_bias (Tf) - k + bits - f
10098 yi = bits >= f ? yh - (yh >> f) : yh
10199 if ex <= 0
102- ex == 0 && return reinterpret (U , unsafe_trunc (T, yi))
103- ex != - 1 || signbit (signed (yi)) && return typemax (U )
104- return reinterpret (U , unsafe_trunc (T, yi + yi))
100+ ex == 0 && return reinterpret (N , unsafe_trunc (T, yi))
101+ ex != - 1 || signbit (signed (yi)) && return typemax (N )
102+ return reinterpret (N , unsafe_trunc (T, yi + yi))
105103 end
106- ex > bits && return reinterpret (U , ex == bits + 1 ? one (T) : zero (T))
107- yi += one (Tw)<< ((ex - 1 ) & bits) # RoundNearestTiesUp
108- return reinterpret (U , unsafe_trunc (T, yi >> (ex & bits)))
104+ ex > bits && return reinterpret (N , ex == bits + 1 ? oneunit (T) : zero (T))
105+ yi += oneunit (Tw)<< ((ex - 1 ) & bits) # RoundNearestTiesUp
106+ return reinterpret (N , unsafe_trunc (T, yi >> (ex & bits)))
109107end
110108
111109rem (x:: T , :: Type{T} ) where {T <: Normed } = x
@@ -115,14 +113,6 @@ rem(x::Float16, ::Type{T}) where {T <: Normed} = rem(Float32(x), T) # avoid ove
115113
116114float (x:: Normed ) = convert (floattype (x), x)
117115
118- macro f32 (x:: Float64 ) # just for hexadecimal floating-point literals
119- :(Float32 ($ x))
120- end
121- macro exp2 (n)
122- :(_exp2 (Val ($ (esc (n)))))
123- end
124- _exp2 (:: Val{N} ) where {N} = exp2 (N)
125-
126116# for Julia v1.0, which does not fold `div_float` before inlining
127117inv_rawone (x) = (@generated ) ? (y = 1.0 / rawone (x); :($ y)) : 1.0 / rawone (x)
128118
@@ -275,7 +265,7 @@ function round(x::Normed{T,f}) where {T,f}
275265 Normed {T,f} (y+ oneunit (Normed{T,f})) : y
276266end
277267function ceil (x:: Normed{T,f} ) where {T,f}
278- k = 8 * sizeof (T)- f
268+ k = bitwidth (T)- f
279269 mask = (typemax (T)<< k)>> k
280270 y = trunc (x)
281271 return convert (T, reinterpret (x)- reinterpret (y)) & (mask)> 0 ?
@@ -324,13 +314,13 @@ end
324314 f = max (f1, f2) # ensure we have enough precision
325315 T = promote_type (T1, T2)
326316 # make sure we have enough integer bits
327- i1, i2 = 8 * sizeof (T1)- f1, 8 * sizeof (T2)- f2 # number of integer bits for each
328- i = 8 * sizeof (T)- f
317+ i1, i2 = bitwidth (T1)- f1, bitwidth (T2)- f2 # number of integer bits for each
318+ i = bitwidth (T)- f
329319 while i < max (i1, i2)
330320 Tw = widen1 (T)
331321 T == Tw && break
332322 T = Tw
333- i = 8 * sizeof (T)- f
323+ i = bitwidth (T)- f
334324 end
335325 :(Normed{$ T,$ f})
336326end
0 commit comments