@@ -26,7 +26,7 @@ signbits(::Type{X}) where {X <: Normed} = 0
26
26
27
27
for T in (UInt8, UInt16, UInt32, UInt64)
28
28
io = IOBuffer ()
29
- for f in 1 : sizeof (T)* 8
29
+ for f in 1 : bitwidth (T)
30
30
sym = Symbol (String (take! (showtype (io, Normed{T,f}))))
31
31
@eval begin
32
32
const $ sym = Normed{$ T,$ f}
@@ -39,7 +39,7 @@ reinterpret(::Type{Normed{T,f}}, x::T) where {T <: Unsigned,f} = Normed{T,f}(x,
39
39
40
40
zero (:: Type{Normed{T,f}} ) where {T,f} = Normed {T,f} (zero (T),0 )
41
41
function 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 )
43
43
end
44
44
one (:: Type{T} ) where {T <: Normed } = oneunit (T)
45
45
zero (x:: Normed ) = zero (typeof (x))
@@ -76,36 +76,34 @@ function _convert(::Type{U}, x::Float16) where {T, f, U <: Normed{T,f}}
76
76
end
77
77
return _convert (U, Float32 (x))
78
78
end
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)
82
82
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)
84
84
end
85
85
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)))
89
88
end
90
89
# 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 | (one (xu) << significand_bits (Tf))
96
+ yh = unsafe_trunc (Tw, significand) << (bits - significand_bits (Tf))
97
+ ex = exponent_bias (Tf) - k + bits - f
100
98
yi = bits >= f ? yh - (yh >> f) : yh
101
99
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))
105
103
end
106
- ex > bits && return reinterpret (U , ex == bits + 1 ? one (T) : zero (T))
104
+ ex > bits && return reinterpret (N , ex == bits + 1 ? one (T) : zero (T))
107
105
yi += one (Tw)<< ((ex - 1 ) & bits) # RoundNearestTiesUp
108
- return reinterpret (U , unsafe_trunc (T, yi >> (ex & bits)))
106
+ return reinterpret (N , unsafe_trunc (T, yi >> (ex & bits)))
109
107
end
110
108
111
109
rem (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
115
113
116
114
float (x:: Normed ) = convert (floattype (x), x)
117
115
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
-
126
116
# for Julia v1.0, which does not fold `div_float` before inlining
127
117
inv_rawone (x) = (@generated ) ? (y = 1.0 / rawone (x); :($ y)) : 1.0 / rawone (x)
128
118
@@ -275,7 +265,7 @@ function round(x::Normed{T,f}) where {T,f}
275
265
Normed {T,f} (y+ oneunit (Normed{T,f})) : y
276
266
end
277
267
function ceil (x:: Normed{T,f} ) where {T,f}
278
- k = 8 * sizeof (T)- f
268
+ k = bitwidth (T)- f
279
269
mask = (typemax (T)<< k)>> k
280
270
y = trunc (x)
281
271
return convert (T, reinterpret (x)- reinterpret (y)) & (mask)> 0 ?
@@ -324,13 +314,13 @@ end
324
314
f = max (f1, f2) # ensure we have enough precision
325
315
T = promote_type (T1, T2)
326
316
# 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
329
319
while i < max (i1, i2)
330
320
Tw = widen1 (T)
331
321
T == Tw && break
332
322
T = Tw
333
- i = 8 * sizeof (T)- f
323
+ i = bitwidth (T)- f
334
324
end
335
325
:(Normed{$ T,$ f})
336
326
end
0 commit comments