@@ -235,26 +235,35 @@ abs(x::Normed) = x
235235/ (x:: T , y:: T ) where {T <: Normed } = convert (T,convert (floattype (T), x)/ convert (floattype (T), y))
236236
237237# 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)))
245248end
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)
252253end
253254
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
258267
259268isfinite (x:: Normed ) = true
260269isnan (x:: Normed ) = false
0 commit comments