@@ -235,26 +235,35 @@ abs(x::Normed) = x
235
235
/ (x:: T , y:: T ) where {T <: Normed } = convert (T,convert (floattype (T), x)/ convert (floattype (T), y))
236
236
237
237
# Functions
238
- trunc (x:: T ) where {T <: Normed } = T (div (reinterpret (x), rawone (T))* rawone (T),0 )
239
- floor (x:: T ) where {T <: Normed } = trunc (x)
240
- function round (x:: Normed{T,f} ) where {T,f}
241
- mask = convert (T, 1 << (f- 1 ))
242
- y = trunc (x)
243
- return convert (T, reinterpret (x)- reinterpret (y)) & mask> 0 ?
244
- Normed {T,f} (y+ oneunit (Normed{T,f})) : y
238
+ trunc (x:: N ) where {N <: Normed } = floor (x)
239
+ floor (x:: N ) where {N <: Normed } = reinterpret (N, x. i - x. i % rawone (N))
240
+ function ceil (x:: Normed{T,f} ) where {T, f}
241
+ f == 1 && return x
242
+ if typemax (T) % rawone (x) != 0
243
+ upper = typemax (T) - typemax (T) % rawone (x)
244
+ x. i > upper && throw_converterror (Normed{T,f}, ceil (T, typemax (x)))
245
+ end
246
+ r = x. i % rawone (x)
247
+ reinterpret (Normed{T,f}, x. i - r + (r > 0 ? rawone (x) : zero (T)))
245
248
end
246
- function ceil (x:: Normed{T,f} ) where {T,f}
247
- k = bitwidth (T)- f
248
- mask = (typemax (T)<< k)>> k
249
- y = trunc (x)
250
- return convert (T, reinterpret (x)- reinterpret (y)) & (mask)> 0 ?
251
- Normed {T,f} (y+ oneunit (Normed{T,f})) : y
249
+ function round (x:: Normed{T,f} ) where {T, f}
250
+ r = x. i % rawone (x)
251
+ q = rawone (x) - r
252
+ reinterpret (Normed{T,f}, r > q ? x. i + q : x. i - r)
252
253
end
253
254
254
- trunc (:: Type{T} , x:: Normed ) where {T <: Integer } = convert (T, div (reinterpret (x), rawone (x)))
255
- round (:: Type{T} , x:: Normed ) where {T <: Integer } = round (T, reinterpret (x)/ rawone (x))
256
- floor (:: Type{T} , x:: Normed ) where {T <: Integer } = trunc (T, x)
257
- ceil (:: Type{T} , x:: Normed ) where {T <: Integer } = ceil (T, reinterpret (x)/ rawone (x))
255
+ trunc (:: Type{Ti} , x:: Normed ) where {Ti <: Integer } = floor (Ti, x)
256
+ function floor (:: Type{Ti} , x:: Normed ) where {Ti <: Integer }
257
+ convert (Ti, reinterpret (x) ÷ rawone (x))
258
+ end
259
+ function ceil (:: Type{Ti} , x:: Normed ) where {Ti <: Integer }
260
+ d, r = divrem (x. i, rawone (x))
261
+ convert (Ti, r > 0 ? d + oneunit (rawtype (x)) : d)
262
+ end
263
+ function round (:: Type{Ti} , x:: Normed ) where {Ti <: Integer }
264
+ d, r = divrem (x. i, rawone (x))
265
+ convert (Ti, r > (rawone (x) >> 0x1 ) ? d + oneunit (rawtype (x)) : d)
266
+ end
258
267
259
268
isfinite (x:: Normed ) = true
260
269
isnan (x:: Normed ) = false
0 commit comments