@@ -173,10 +173,11 @@ julia> typeof(numerator(a))
173
173
BigInt
174
174
```
175
175
"""
176
- function rationalize (:: Type{T} , x:: AbstractFloat , tol:: Real ) where T<: Integer
176
+ function rationalize (:: Type{T} , x:: Union{ AbstractFloat, Rational} , tol:: Real ) where T<: Integer
177
177
if tol < 0
178
178
throw (ArgumentError (" negative tolerance $tol " ))
179
179
end
180
+
180
181
T<: Unsigned && x < 0 && __throw_negate_unsigned ()
181
182
isnan (x) && return T (x)// one (T)
182
183
isinf (x) && return unsafe_rational (x < 0 ? - one (T) : one (T), zero (T))
@@ -188,7 +189,6 @@ function rationalize(::Type{T}, x::AbstractFloat, tol::Real) where T<:Integer
188
189
a = trunc (x)
189
190
r = x- a
190
191
y = one (x)
191
-
192
192
tolx = oftype (x, tol)
193
193
nt, t, tt = tolx, zero (tolx), tolx
194
194
ia = np = nq = zero (T)
@@ -233,10 +233,21 @@ function rationalize(::Type{T}, x::AbstractFloat, tol::Real) where T<:Integer
233
233
return p // q
234
234
end
235
235
end
236
- rationalize (:: Type{T} , x:: AbstractFloat ; tol:: Real = eps (x)) where {T<: Integer } = rationalize (T, x, tol):: Rational{T}
236
+ rationalize (:: Type{T} , x:: AbstractFloat ; tol:: Real = eps (x)) where {T<: Integer } = rationalize (T, x, tol)
237
237
rationalize (x:: AbstractFloat ; kvs... ) = rationalize (Int, x; kvs... )
238
- rationalize (:: Type{T} , x:: Complex ; kvs... ) where {T<: Integer } = Complex (rationalize (T, x. re, kvs... ):: Rational{T} , rationalize (T, x. im, kvs... ):: Rational{T} )
239
- rationalize (x:: Complex ; kvs... ) = Complex (rationalize (Int, x. re, kvs... ), rationalize (Int, x. im, kvs... ))
238
+ rationalize (:: Type{T} , x:: Complex ; kvs... ) where {T<: Integer } = Complex (rationalize (T, x. re; kvs... ), rationalize (T, x. im; kvs... ))
239
+ rationalize (x:: Complex ; kvs... ) = Complex (rationalize (Int, x. re; kvs... ), rationalize (Int, x. im; kvs... ))
240
+ rationalize (:: Type{T} , x:: Rational ; tol:: Real = 0 ) where {T<: Integer } = rationalize (T, x, tol)
241
+ rationalize (x:: Rational ; kvs... ) = x
242
+ rationalize (x:: Integer ; kvs... ) = Rational (x)
243
+ function rationalize (:: Type{T} , x:: Integer ; kvs... ) where {T<: Integer }
244
+ if Base. hastypemax (T) # BigInt doesn't
245
+ x < typemin (T) && return unsafe_rational (- one (T), zero (T))
246
+ x > typemax (T) && return unsafe_rational (one (T), zero (T))
247
+ end
248
+ return Rational {T} (x)
249
+ end
250
+
240
251
241
252
"""
242
253
numerator(x)
0 commit comments