File tree Expand file tree Collapse file tree 2 files changed +14
-4
lines changed Expand file tree Collapse file tree 2 files changed +14
-4
lines changed Original file line number Diff line number Diff line change @@ -11,12 +11,18 @@ struct Rational{T<:Integer} <: Real
11
11
den:: T
12
12
13
13
function Rational {T} (num:: Integer , den:: Integer ) where T<: Integer
14
- num == den == zero (T) && __throw_rational_argerror (T)
15
- num2, den2 = signbit (den) ? divgcd (- num, - den) : divgcd (num, den)
16
- new (num2, den2)
14
+ num == den == zero (T) && __throw_rational_argerror_zero (T)
15
+ num2, den2 = divgcd (num, den)
16
+ if T<: Signed && signbit (den2)
17
+ den2 = - den2
18
+ signbit (den2) && __throw_rational_argerror_typemin (T)
19
+ num2 = - num2
20
+ end
21
+ return new (num2, den2)
17
22
end
18
23
end
19
- @noinline __throw_rational_argerror (T) = throw (ArgumentError (" invalid rational: zero($T )//zero($T )" ))
24
+ @noinline __throw_rational_argerror_zero (T) = throw (ArgumentError (" invalid rational: zero($T )//zero($T )" ))
25
+ @noinline __throw_rational_argerror_typemin (T) = throw (ArgumentError (" invalid rational: denominator can't be typemin($T )" ))
20
26
21
27
Rational (n:: T , d:: T ) where {T<: Integer } = Rational {T} (n,d)
22
28
Rational (n:: Integer , d:: Integer ) = Rational (promote (n,d)... )
Original file line number Diff line number Diff line change @@ -32,6 +32,10 @@ using Test
32
32
@test_throws ArgumentError rationalize (Int, big (3.0 ), - 1. )
33
33
# issue 26823
34
34
@test_throws InexactError rationalize (Int, NaN )
35
+ # issue 32569
36
+ @test_throws ArgumentError 1 // typemin (Int)
37
+ @test - 2 // typemin (Int) == - 1 // (typemin (Int) >> 1 )
38
+ @test 2 // typemin (Int) == 1 // (typemin (Int) >> 1 )
35
39
36
40
for a = - 5 : 5 , b = - 5 : 5
37
41
if a == b == 0 ; continue ; end
You can’t perform that action at this time.
0 commit comments