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