From 6a5885c2d70b6b104b9017ac98d06672990b3741 Mon Sep 17 00:00:00 2001 From: Sean Garborg Date: Tue, 14 Apr 2020 18:04:36 -0500 Subject: [PATCH 1/3] Add specialized * for Rational and Integer --- base/rational.jl | 5 +++++ test/rational.jl | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/base/rational.jl b/base/rational.jl index 911afb1cb06b6..3d95b7d4b878f 100644 --- a/base/rational.jl +++ b/base/rational.jl @@ -279,6 +279,11 @@ function *(x::Rational, y::Rational) xd,yn = divgcd(x.den,y.num) checked_mul(xn,yn) // checked_mul(xd,yd) end +function *(x::Rational, y::Integer) + xd,yn = divgcd(x.den,y) + checked_mul(x.num,yn) // xd +end +*(x::Integer, y::Rational) = *(y, x) /(x::Rational, y::Rational) = x//y /(x::Rational, y::Complex{<:Union{Integer,Rational}}) = x//y inv(x::Rational) = Rational(x.den, x.num) diff --git a/test/rational.jl b/test/rational.jl index 4a5f1ce7c567c..7a8f37e711320 100644 --- a/test/rational.jl +++ b/test/rational.jl @@ -414,11 +414,16 @@ end @test rem(q, i) == q - i*div(q, i) @test mod(q, i) == q - i*fld(q, i) end + @test 1//2 * 3 == 3//2 + @test -3 * (1//2) == -3//2 @test_throws OverflowError UInt(1)//2 - 1 @test_throws OverflowError 1 - UInt(5)//2 @test_throws OverflowError 1//typemax(Int64) + 1 @test_throws OverflowError Int8(1) + Int8(5)//(Int8(127)-Int8(1)) + @test_throws InexactError UInt(1)//2 * -1 + @test_throws OverflowError typemax(Int64)//1 * 2 + @test_throws OverflowError -1//1 * typemin(Int64) @test Int8(1) + Int8(4)//(Int8(127)-Int8(1)) == Int8(65) // Int8(63) @test -Int32(1) // typemax(Int32) - Int32(1) == typemin(Int32) // typemax(Int32) From 8b28ddb98a58de0181272235fefdc8c0e1d4bd98 Mon Sep 17 00:00:00 2001 From: Stefan Karpinski Date: Wed, 15 Apr 2020 00:41:04 -0400 Subject: [PATCH 2/3] Update base/rational.jl --- base/rational.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/base/rational.jl b/base/rational.jl index 3d95b7d4b878f..0729f5d3c59ab 100644 --- a/base/rational.jl +++ b/base/rational.jl @@ -280,7 +280,7 @@ function *(x::Rational, y::Rational) checked_mul(xn,yn) // checked_mul(xd,yd) end function *(x::Rational, y::Integer) - xd,yn = divgcd(x.den,y) + xd, yn = divgcd(x.den, y) checked_mul(x.num,yn) // xd end *(x::Integer, y::Rational) = *(y, x) From c125b79e67752965b6581155f141b3b25d557b2d Mon Sep 17 00:00:00 2001 From: Stefan Karpinski Date: Wed, 15 Apr 2020 00:42:02 -0400 Subject: [PATCH 3/3] Update base/rational.jl --- base/rational.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/base/rational.jl b/base/rational.jl index 0729f5d3c59ab..5d2674f14e89a 100644 --- a/base/rational.jl +++ b/base/rational.jl @@ -281,7 +281,7 @@ function *(x::Rational, y::Rational) end function *(x::Rational, y::Integer) xd, yn = divgcd(x.den, y) - checked_mul(x.num,yn) // xd + checked_mul(x.num, yn) // xd end *(x::Integer, y::Rational) = *(y, x) /(x::Rational, y::Rational) = x//y