1
1
module RoundingIntegers
2
2
3
- using Compat
4
- import Base: < , <= , + , - , * , ~ , & , | , $ , << , >> , >>>
3
+ import Base: < , <= , + , - , * , ~ , & , | , << , >> , >>> , xor
5
4
6
5
export RSigned, RUnsigned, RInteger
7
6
export RInt8, RUInt8, RInt16, RUInt16, RInt32, RUInt32, RInt64, RUInt64,
@@ -63,62 +62,40 @@ rtype(x::Union{Signed,Unsigned}) = rtype(typeof(x))
63
62
# RIntegers are largely about assignment; for usage, we convert to
64
63
# standard integers at the drop of a hat.
65
64
66
- Base. promote_rule (:: Type{T } , :: Type{RI } ) where {T<: Number ,RI<: RInteger } =
65
+ Base. promote_rule (:: Type{RI } , :: Type{T } ) where {T<: Number ,RI<: RInteger } =
67
66
promote_type (T, itype (RI))
68
- # Resolve ambiguities
69
- Base. promote_rule (:: Type{Bool} , :: Type{RI} ) where {RI<: RInteger } =
70
- promote_type (Bool, itype (RI))
71
- Base. promote_rule (:: Type{BigInt} , :: Type{RI} ) where {RI<: RInteger } =
72
- promote_type (BigInt, itype (RI))
73
- Base. promote_rule (:: Type{BigFloat} , :: Type{RI} ) where {RI<: RInteger } =
74
- promote_type (BigFloat, itype (RI))
75
- Base. promote_rule (:: Type{Complex{T}} , :: Type{RI} ) where {T<: Real ,RI<: RInteger } =
76
- promote_type (Complex{T}, itype (RI))
77
- Base. promote_rule (:: Type{Rational{T}} , :: Type{RI} ) where {T<: Integer ,RI<: RInteger } =
78
- promote_type (Rational{T}, itype (RI))
79
- Base. promote_rule (:: Type{<:Irrational} , :: Type{RI} ) where {RI<: RInteger } =
80
- promote_type (Float64, itype (RI))
81
-
82
- Signed (x:: RSigned ) = reinterpret (itype (x), x)
83
- Unsigned (x:: RUnsigned ) = reinterpret (itype (x), x)
67
+
68
+ Base. Signed (x:: RSigned ) = reinterpret (itype (x), x)
69
+ Base. Unsigned (x:: RUnsigned ) = reinterpret (itype (x), x)
84
70
RSigned (x:: Signed ) = reinterpret (rtype (x), x)
85
71
RUnsigned (x:: Unsigned ) = reinterpret (rtype (x), x)
86
- Integer (x:: RSigned ) = Signed (x)
87
- Integer (x:: RUnsigned ) = Unsigned (x)
72
+ Base . Integer (x:: RSigned ) = Signed (x)
73
+ Base . Integer (x:: RUnsigned ) = Unsigned (x)
88
74
RInteger (x:: Signed ) = RSigned (x)
89
75
RInteger (x:: Unsigned ) = RUnsigned (x)
90
76
91
- # Basic conversions
92
- # @inline Base.convert{T<:RSigned}(::Type{T}, x::T) = x
93
- # @inline Base.convert{T<:RUnsigned}(::Type{T}, x::T) = x
94
- @inline Base. convert (:: Type{T} , x:: T ) where {T<: RInteger } = x
95
- @inline Base. convert (:: Type{T} , x:: RInteger ) where {T<: RInteger } =
96
- RInteger (convert (itype (T), Integer (x)))
97
- @inline Base. convert (:: Type{T} , x:: Integer ) where {T<: RInteger } = RInteger (convert (itype (T), x))
98
- @inline Base. convert (:: Type{T} , x:: AbstractFloat ) where {T<: RInteger } =
99
- RInteger (round (itype (T), digits= x))
100
- @inline Base. convert (:: Type{T} , x:: Number ) where {T<: RInteger } =
101
- convert (T, convert (itype (T), x))
77
+ Base. AbstractFloat (x:: RInteger ) = AbstractFloat (Integer (x))
78
+
79
+ RInt8 (x:: Int8 ) = reinterpret (RInt8, x)
80
+ RUInt8 (x:: UInt8 ) = reinterpret (RUInt8, x)
81
+ RInt16 (x:: Int16 ) = reinterpret (RInt16, x)
82
+ RUInt16 (x:: UInt16 ) = reinterpret (RUInt16, x)
83
+ RInt32 (x:: Int32 ) = reinterpret (RInt32, x)
84
+ RUInt32 (x:: UInt32 ) = reinterpret (RUInt32, x)
85
+ RInt64 (x:: Int64 ) = reinterpret (RInt64, x)
86
+ RUInt64 (x:: UInt64 ) = reinterpret (RUInt64, x)
87
+ RInt128 (x:: Int128 ) = reinterpret (RInt128, x)
88
+ RUInt128 (x:: UInt128 ) = reinterpret (RUInt128, x)
89
+
90
+ (:: Type{R} )(x:: Integer ) where R<: RInteger = R (convert (itype (R), x))
91
+ (:: Type{R} )(x:: Float16 ) where R<: RInteger = R (round (itype (R), x))
92
+ (:: Type{R} )(x:: BigFloat ) where R<: RInteger = R (round (itype (R), x))
93
+ (:: Type{R} )(x:: Rational ) where R<: RInteger = R (round (itype (R), x))
94
+ (:: Type{R} )(x:: Complex ) where R<: RInteger = R (round (itype (R), x))
95
+ (:: Type{R} )(x:: AbstractFloat ) where R<: RInteger = R (round (itype (R), x))
102
96
103
97
@inline Base. convert (:: Type{T} , x:: RInteger ) where {T<: Number } = convert (T, Integer (x))
104
98
105
- # Resolve ambiguities
106
- Base. convert (:: Type{Integer} , x:: RInteger ) = Integer (x)
107
- Base. convert (:: Type{BigInt} , x:: RInteger ) = convert (BigInt, Integer (x))
108
- Base. convert (:: Type{T} , x:: BigInt ) where {T<: RInteger } = RInteger (convert (itype (T), x))
109
- Base. convert (:: Type{BigFloat} , x:: RInteger ) = convert (BigFloat, Integer (x))
110
- Base. convert (:: Type{T} , x:: BigFloat ) where {T<: RInteger } = RInteger (convert (itype (T), x))
111
- Base. convert (:: Type{Complex{T}} , x:: RInteger ) where {T<: Real } = convert (Complex{T}, Integer (x))
112
- Base. convert (:: Type{T} , z:: Complex ) where {T<: RInteger } = RInteger (convert (itype (T), z))
113
- Base. convert (:: Type{Complex} , x:: RInteger ) = Complex (x)
114
- Base. convert (:: Type{T} , x:: Rational ) where {T<: RInteger } = RInteger (convert (itype (T)), x)
115
- Base. convert (:: Type{Rational{T}} , x:: RInteger ) where {T<: Integer } =
116
- convert (Rational{T}, Integer (x))
117
- Base. convert (:: Type{Rational} , x:: RInteger ) = convert (Rational{typeof (x)}, x)
118
- Base. convert (:: Type{Float16} , x:: RInteger ) = convert (Float16, Integer (x))
119
- Base. convert (:: Type{T} , x:: Float16 ) where {T<: RInteger } = RInteger (convert (itype (T), x))
120
- Base. convert (:: Type{Bool} , x:: RInteger ) = convert (Bool, Integer (x))
121
-
122
99
# rem conversions
123
100
@inline Base. rem (x:: T , :: Type{T} ) where {T<: RInteger } = T
124
101
@inline Base. rem (x:: Integer , :: Type{T} ) where {T<: RInteger } = RInteger (rem (x, itype (T)))
@@ -135,6 +112,8 @@ Base.count_ones(x::RInteger) = count_ones(Integer(x))
135
112
Base. leading_zeros (x:: RInteger ) = leading_zeros (Integer (x))
136
113
Base. trailing_zeros (x:: RInteger ) = trailing_zeros (Integer (x))
137
114
Base. ndigits0z (x:: RInteger ) = Base. ndigits0z (Integer (x))
115
+ Base. ndigits0zpb (x:: RSigned , b:: Integer ) = Base. ndigits0zpb (abs (Integer (x)), Int (b))
116
+ Base. ndigits0zpb (x:: RUnsigned , b:: Integer ) = Base. ndigits0zpb (Integer (x), Int (b))
138
117
139
118
# A few operations preserve the type
140
119
- (x:: RInteger ) = RInteger (- Integer (x))
@@ -156,8 +135,7 @@ Base.ndigits0z(x::RInteger) = Base.ndigits0z(Integer(x))
156
135
* (x:: T , y:: T ) where {T<: RInteger } = RInteger (Integer (x) * Integer (y))
157
136
(& )(x:: T , y:: T ) where {T<: RInteger } = RInteger (Integer (x) & Integer (y))
158
137
(| )(x:: T , y:: T ) where {T<: RInteger } = RInteger (Integer (x) | Integer (y))
159
- # ($){T<:RInteger}(x::T, y::T) = RInteger(Integer(x) $ Integer(y))
160
- Compat. xor (x:: T , y:: T ) where {T<: RInteger } = RInteger (xor (Integer (x), Integer (y)))
138
+ xor (x:: T , y:: T ) where {T<: RInteger } = RInteger (xor (Integer (x), Integer (y)))
161
139
162
140
Base. rem (x:: T , y:: T ) where {T<: RInteger } = RInteger (rem (Integer (x), Integer (y)))
163
141
Base. mod (x:: T , y:: T ) where {T<: RInteger } = RInteger (mod (Integer (x), Integer (y)))
0 commit comments