@@ -13,6 +13,8 @@ widen1(::Type{Int128}) = Int128
13
13
widen1 (:: Type{UInt128} ) = UInt128
14
14
widen1 (x:: Integer ) = x % widen1 (typeof (x))
15
15
16
+ signedtype (:: Type{T} ) where {T <: Integer } = typeof (signed (zero (T)))
17
+
16
18
const ShortInts = Union{Int8, UInt8, Int16, UInt16}
17
19
const LongInts = Union{Int64, UInt64, Int128, UInt128, BigInt}
18
20
@@ -34,3 +36,14 @@ significand_bits(::Type{Float32}) = 23
34
36
significand_bits (:: Type{Float64} ) = 52
35
37
exponent_bias (:: Type{Float32} ) = 127
36
38
exponent_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