diff --git a/base/float.jl b/base/float.jl index 4d65e56be4ded..8be322ba4ea6f 100644 --- a/base/float.jl +++ b/base/float.jl @@ -598,7 +598,7 @@ signed integer, so that `abs(typemin(x)) == typemin(x) < 0`, in which case the r `uabs(x)` will be an unsigned integer of the same size. """ uabs(x::Integer) = abs(x) -uabs(x::Signed) = unsigned(abs(x)) +uabs(x::BitSigned) = unsigned(abs(x)) """ diff --git a/base/gmp.jl b/base/gmp.jl index 9abfc34d44610..2b2afc9fcc558 100644 --- a/base/gmp.jl +++ b/base/gmp.jl @@ -43,11 +43,11 @@ else end """ - BigInt <: Integer + BigInt <: Signed Arbitrary precision integer type. """ -mutable struct BigInt <: Integer +mutable struct BigInt <: Signed alloc::Cint size::Cint d::Ptr{Limb} @@ -313,7 +313,7 @@ rem(x::BigInt, ::Type{Bool}) = !iszero(x) & unsafe_load(x.d) % Bool # never unsa rem(x::BigInt, ::Type{T}) where T<:Union{SLimbMax,ULimbMax} = iszero(x) ? zero(T) : flipsign(unsafe_load(x.d) % T, x.size) -function rem(x::BigInt, ::Type{T}) where T<:Union{Unsigned,Signed} +function rem(x::BigInt, ::Type{T}) where T<:Union{Base.BitUnsigned,Base.BitSigned} u = zero(T) for l = 1:min(abs(x.size), cld(sizeof(T), sizeof(Limb))) u += (unsafe_load(x.d, l) % T) << ((sizeof(Limb)<<3)*(l-1)) @@ -588,6 +588,8 @@ ispos(x::BigInt) = x.size > 0 signbit(x::BigInt) = isneg(x) flipsign!(x::BigInt, y::Integer) = (signbit(y) && (x.size = -x.size); x) flipsign( x::BigInt, y::Integer) = signbit(y) ? -x : x +flipsign( x::BigInt, y::BigInt) = signbit(y) ? -x : x +# above method to resolving ambiguities with flipsign(::T, ::T) where T<:Signed string(x::BigInt) = dec(x) show(io::IO, x::BigInt) = print(io, string(x)) diff --git a/base/int.jl b/base/int.jl index df3f4823f9512..e563dcc066df8 100644 --- a/base/int.jl +++ b/base/int.jl @@ -84,7 +84,6 @@ signbit(x::Unsigned) = false flipsign(x::T, y::T) where {T<:BitSigned} = flipsign_int(x, y) flipsign(x::BitSigned, y::BitSigned) = flipsign_int(promote(x, y)...) % typeof(x) -flipsign(x::Signed, y::Signed) = convert(typeof(x), flipsign(promote(x, y)...)) flipsign(x::Signed, y::Float16) = flipsign(x, bitcast(Int16, y)) flipsign(x::Signed, y::Float32) = flipsign(x, bitcast(Int32, y)) flipsign(x::Signed, y::Float64) = flipsign(x, bitcast(Int64, y)) @@ -125,7 +124,7 @@ abs(x::Signed) = flipsign(x,x) ~(n::Integer) = -n-1 -unsigned(x::Signed) = reinterpret(typeof(convert(Unsigned, zero(x))), x) +unsigned(x::BitSigned) = reinterpret(typeof(convert(Unsigned, zero(x))), x) unsigned(x::Bool) = convert(Unsigned, x) """ @@ -157,11 +156,11 @@ signed without checking for overflow. """ signed(x) = convert(Signed, x) -div(x::Signed, y::Unsigned) = flipsign(signed(div(unsigned(abs(x)), y)), x) -div(x::Unsigned, y::Signed) = unsigned(flipsign(signed(div(x, unsigned(abs(y)))), y)) +div(x::BitSigned, y::Unsigned) = flipsign(signed(div(unsigned(abs(x)), y)), x) +div(x::Unsigned, y::BitSigned) = unsigned(flipsign(signed(div(x, unsigned(abs(y)))), y)) -rem(x::Signed, y::Unsigned) = flipsign(signed(rem(unsigned(abs(x)), y)), x) -rem(x::Unsigned, y::Signed) = rem(x, unsigned(abs(y))) +rem(x::BitSigned, y::Unsigned) = flipsign(signed(rem(unsigned(abs(x)), y)), x) +rem(x::Unsigned, y::BitSigned) = rem(x, unsigned(abs(y))) fld(x::Signed, y::Unsigned) = div(x, y) - (signbit(x) & (rem(x, y) != 0)) fld(x::Unsigned, y::Signed) = div(x, y) - (signbit(y) & (rem(x, y) != 0)) @@ -396,12 +395,12 @@ trailing_ones(x::Integer) = trailing_zeros(~x) (<=)(x::T, y::T) where {T<:BitSigned} = sle_int(x, y) (<=)(x::T, y::T) where {T<:BitUnsigned} = ule_int(x, y) -==(x::Signed, y::Unsigned) = (x >= 0) & (unsigned(x) == y) -==(x::Unsigned, y::Signed ) = (y >= 0) & (x == unsigned(y)) -<( x::Signed, y::Unsigned) = (x < 0) | (unsigned(x) < y) -<( x::Unsigned, y::Signed ) = (y >= 0) & (x < unsigned(y)) -<=(x::Signed, y::Unsigned) = (x < 0) | (unsigned(x) <= y) -<=(x::Unsigned, y::Signed ) = (y >= 0) & (x <= unsigned(y)) +==(x::BitSigned, y::BitUnsigned) = (x >= 0) & (unsigned(x) == y) +==(x::BitUnsigned, y::BitSigned ) = (y >= 0) & (x == unsigned(y)) +<( x::BitSigned, y::BitUnsigned) = (x < 0) | (unsigned(x) < y) +<( x::BitUnsigned, y::BitSigned ) = (y >= 0) & (x < unsigned(y)) +<=(x::BitSigned, y::BitUnsigned) = (x < 0) | (unsigned(x) <= y) +<=(x::BitUnsigned, y::BitSigned ) = (y >= 0) & (x <= unsigned(y)) ## integer shifts ## diff --git a/base/intfuncs.jl b/base/intfuncs.jl index e34986037b5fa..e60408dce1f33 100644 --- a/base/intfuncs.jl +++ b/base/intfuncs.jl @@ -424,7 +424,7 @@ function ndigits0z(x::UInt128) return n + ndigits0z(UInt64(x)) end -ndigits0z(x::Signed) = ndigits0z(unsigned(abs(x))) +ndigits0z(x::BitSigned) = ndigits0z(unsigned(abs(x))) ndigits0z(x::Integer) = ndigits0zpb(x, 10) diff --git a/base/rational.jl b/base/rational.jl index a7bfdd64d7de9..a23c38dc2a59c 100644 --- a/base/rational.jl +++ b/base/rational.jl @@ -231,7 +231,7 @@ typemax(::Type{Rational{T}}) where {T<:Integer} = one(T)//zero(T) isinteger(x::Rational) = x.den == 1 -(x::Rational) = (-x.num) // x.den -function -(x::Rational{T}) where T<:Signed +function -(x::Rational{T}) where T<:BitSigned x.num == typemin(T) && throw(OverflowError("rational numerator is typemin(T)")) (-x.num) // x.den end diff --git a/test/bigint.jl b/test/bigint.jl index 71a2fd16e8cec..6dadc6556cece 100644 --- a/test/bigint.jl +++ b/test/bigint.jl @@ -371,3 +371,6 @@ end @test typeof(tan(a)) == BigFloat @test typeof(cos(a)) == BigFloat @test typeof(sin(a)) == BigFloat + +@test BigInt <: Signed +@test big(1) isa Signed diff --git a/test/parse.jl b/test/parse.jl index 15b37e3d341b1..a2a623c50d123 100644 --- a/test/parse.jl +++ b/test/parse.jl @@ -201,6 +201,7 @@ macro test999_str(args...); args; end # Issue 20587 for T in vcat(subtypes(Signed), subtypes(Unsigned)) + T === BigInt && continue # TODO: make BigInt pass this test for s in ["", " ", " "] # Without a base (handles things like "0x00001111", etc) result = @test_throws ArgumentError parse(T, s)