@@ -159,10 +159,10 @@ function Base.Float32(x::Normed{UInt32,f}) where f
159
159
f == 1 && return Float32 (x. i)
160
160
i32 = unsafe_trunc (Int32, x. i)
161
161
if f == 32
162
- rh, rl = Float32 (i32>>> 16 ), Float32 ((i32& 0xFFFF )<< 8 | ( i32>>> 24 ) )
162
+ rh, rl = Float32 (i32>>> 0x10 ), Float32 ((i32& 0xFFFF )<< 0x8 | i32>>> 0x18 )
163
163
return muladd (rh, @f32 (0x1 p- 16 ), rl * @f32 (0x1 p- 40 ))
164
164
elseif f >= 25
165
- rh, rl = Float32 (i32>>> 16 ), Float32 ((( i32& 0xFFFF )<< 14 ) + ( i32>>> (f- 14 ) ))
165
+ rh, rl = Float32 (i32>>> 0x10 ), Float32 ((i32& 0xFFFF )<< 0xE + i32>>> UInt8 (f- 14 ))
166
166
return muladd (rh, Float32 (@exp2 (16 - f)), rl * Float32 (@exp2 (- 14 - f)))
167
167
end
168
168
# FIXME : avoid the branch in native x86_64 (non-SIMD) codes
@@ -179,49 +179,49 @@ end
179
179
function Base. Float64 (x:: Normed{UInt32,f} ) where f
180
180
f64 = Float64 (x. i)
181
181
f == 1 && return f64
182
- f == 2 && return (f64 * 0x040001 ) * 0x15555000015555 p- 72
183
- f == 3 && return (f64 * 0x108421 ) * 0x11b6db76924929 p- 75
184
- f == 4 && return (f64 * 0x010101 ) * 0x11000011000011 p- 72
185
- f == 5 && return (f64 * 0x108421 ) * 0x04000002000001 p- 75
186
- f == 6 && return (f64 * 0x09dfb1 ) * 0x1a56b8e38e6d91 p- 78
187
- f == 7 && return (f64 * 0x000899 ) * 0x0f01480001e029 p- 70
188
- f == 8 && return (f64 * 0x0a5a5b ) * 0x18d300000018d3 p- 80
189
- f == 9 && return (f64 * 0x001001 ) * 0x080381c8e3f201 p- 72
190
- f == 10 && return (f64 * 0x100001 ) * 0x04010000000401 p- 80
191
- f == 11 && return (f64 * 0x000009 ) * 0x0e3aaae3955639 p- 66
192
- f == 12 && return (f64 * 0x0a8055 ) * 0x186246e46e4cfd p- 84
193
- f == 13 && return (f64 * 0x002001 ) * 0x10000004000001 p- 78
194
- f == 14 && return (f64 * 0x03400d ) * 0x13b13b14ec4ec5 p- 84
195
- f == 15 && return (f64 * 0x000259 ) * 0x06d0c5a4f3a5e9 p- 75
196
- f == 16 && return (f64 * 0x011111 ) * 0x00f000ff00fff1 p- 80
197
- f == 18 && return (f64 * 0x0b06d1 ) * 0x17377445dd1231 p- 90
198
- f == 19 && return (f64 * 0x080001 ) * 0x00004000000001 p- 76
199
- f == 20 && return (f64 * 0x000101 ) * 0x0ff010ef10ff01 p- 80
200
- f == 21 && return (f64 * 0x004001 ) * 0x01fff8101fc001 p- 84
201
- f == 22 && return (f64 * 0x002945 ) * 0x18d0000000018d p- 88
202
- f == 23 && return (f64 * 0x044819 ) * 0x07794a23729429 p- 92
203
- f == 27 && return (f64 * 0x000a21 ) * 0x0006518c7df9e1 p- 81
204
- f == 28 && return (f64 * 0x00000d ) * 0x13b13b14ec4ec5 p- 84
205
- f == 30 && return (f64 * 0x001041 ) * 0x00fc003f03ffc1 p- 90
206
- f == 32 && return (f64 * 0x010101 ) * 0x00ff0000ffff01 p- 96
182
+ f == 2 && return (f64 * 0x040001 p0 ) * 0x15555000015555 p- 72
183
+ f == 3 && return (f64 * 0x108421 p0 ) * 0x11b6db76924929 p- 75
184
+ f == 4 && return (f64 * 0x010101 p0 ) * 0x11000011000011 p- 72
185
+ f == 5 && return (f64 * 0x108421 p0 ) * 0x04000002000001 p- 75
186
+ f == 6 && return (f64 * 0x09dfb1 p0 ) * 0x1a56b8e38e6d91 p- 78
187
+ f == 7 && return (f64 * 0x000899 p0 ) * 0x0f01480001e029 p- 70
188
+ f == 8 && return (f64 * 0x0a5a5b p0 ) * 0x18d300000018d3 p- 80
189
+ f == 9 && return (f64 * 0x001001 p0 ) * 0x080381c8e3f201 p- 72
190
+ f == 10 && return (f64 * 0x100001 p0 ) * 0x04010000000401 p- 80
191
+ f == 11 && return (f64 * 0x000009 p0 ) * 0x0e3aaae3955639 p- 66
192
+ f == 12 && return (f64 * 0x0a8055 p0 ) * 0x186246e46e4cfd p- 84
193
+ f == 13 && return (f64 * 0x002001 p0 ) * 0x10000004000001 p- 78
194
+ f == 14 && return (f64 * 0x03400d p0 ) * 0x13b13b14ec4ec5 p- 84
195
+ f == 15 && return (f64 * 0x000259 p0 ) * 0x06d0c5a4f3a5e9 p- 75
196
+ f == 16 && return (f64 * 0x011111 p0 ) * 0x00f000ff00fff1 p- 80
197
+ f == 18 && return (f64 * 0x0b06d1 p0 ) * 0x17377445dd1231 p- 90
198
+ f == 19 && return (f64 * 0x080001 p0 ) * 0x00004000000001 p- 76
199
+ f == 20 && return (f64 * 0x000101 p0 ) * 0x0ff010ef10ff01 p- 80
200
+ f == 21 && return (f64 * 0x004001 p0 ) * 0x01fff8101fc001 p- 84
201
+ f == 22 && return (f64 * 0x002945 p0 ) * 0x18d0000000018d p- 88
202
+ f == 23 && return (f64 * 0x044819 p0 ) * 0x07794a23729429 p- 92
203
+ f == 27 && return (f64 * 0x000a21 p0 ) * 0x0006518c7df9e1 p- 81
204
+ f == 28 && return (f64 * 0x00000d p0 ) * 0x13b13b14ec4ec5 p- 84
205
+ f == 30 && return (f64 * 0x001041 p0 ) * 0x00fc003f03ffc1 p- 90
206
+ f == 32 && return (f64 * 0x010101 p0 ) * 0x00ff0000ffff01 p- 96
207
207
f64 / rawone (x)
208
208
end
209
209
function Base. Float64 (x:: Normed{UInt64,f} ) where f
210
210
f == 1 && return Float64 (x. i)
211
211
if f >= 53
212
- rh = Float64 (unsafe_trunc (Int64, x. i >> 16 )) * @exp2 (16 - f) # upper 48 bits
212
+ rh = Float64 (unsafe_trunc (Int64, x. i>> 0x10 )) * @exp2 (16 - f) # upper 48 bits
213
213
rl = Float64 (unsafe_trunc (Int32, x. i& 0xFFFF )) * @exp2 (- f) # lower 16 bits
214
214
return rh + muladd (rh, @exp2 (- f), rl)
215
215
end
216
216
x. i / rawone (x)
217
217
end
218
218
function Base. Float64 (x:: Normed{UInt128,f} ) where f
219
219
f == 1 && return Float64 (x. i)
220
- ih, il = unsafe_trunc (Int64, x. i>> 64 ), unsafe_trunc (Int64, x. i)
221
- rh = Float64 (ih>>> 16 ) * @exp2 (f <= 53 ? 80 : 80 - f) # upper 48 bits
220
+ ih, il = unsafe_trunc (Int64, x. i>> 0x40 ), unsafe_trunc (Int64, x. i)
221
+ rh = Float64 (ih>>> 0x10 ) * @exp2 (f <= 53 ? 80 : 80 - f) # upper 48 bits
222
222
km = @exp2 (f <= 53 ? 48 : 48 - f) # for middle 32 bits
223
223
rm = Float64 (unsafe_trunc (Int32, ih& 0xFFFF )) * (0x1 p16 * km) +
224
- Float64 (unsafe_trunc (Int32, il>>> 48 )) * km
224
+ Float64 (unsafe_trunc (Int32, il>>> 0x30 )) * km
225
225
rl = Float64 (il& 0xFFFFFFFFFFFF ) * @exp2 (f <= 53 ? 0 : - f) # lower 48 bits
226
226
if f <= 53
227
227
return (rh + (rm + rl)) / unsafe_trunc (Int64, rawone (x))
0 commit comments