@@ -13,6 +13,8 @@ widen1(::Type{Int128}) = Int128
1313widen1 (:: Type{UInt128} ) = UInt128
1414widen1 (x:: Integer ) = x % widen1 (typeof (x))
1515
16+ signedtype (:: Type{T} ) where {T <: Integer } = typeof (signed (zero (T)))
17+
1618const ShortInts = Union{Int8, UInt8, Int16, UInt16}
1719const LongInts = Union{Int64, UInt64, Int128, UInt128, BigInt}
1820
@@ -34,3 +36,14 @@ significand_bits(::Type{Float32}) = 23
3436significand_bits (:: Type{Float64} ) = 52
3537exponent_bias (:: Type{Float32} ) = 127
3638exponent_bias (:: Type{Float64} ) = 1023
39+
40+ _unsafe_trunc (:: Type{T} , x:: Integer ) where {T} = x % T
41+ _unsafe_trunc (:: Type{T} , x) where {T} = unsafe_trunc (T, x)
42+ if ! signbit (signed (unsafe_trunc (UInt, - 12.345 )))
43+ # a workaround for ARM (issue #134)
44+ function _unsafe_trunc (:: Type{T} , x:: AbstractFloat ) where {T <: Integer }
45+ unsafe_trunc (T, unsafe_trunc (signedtype (T), x))
46+ end
47+ # exclude BigFloat (issue #202)
48+ _unsafe_trunc (:: Type{T} , x:: BigFloat ) where {T <: Integer } = unsafe_trunc (T, x)
49+ end
0 commit comments