Skip to content

Commit

Permalink
fix #7 (#8)
Browse files Browse the repository at this point in the history
  • Loading branch information
fkastner committed Feb 7, 2022
1 parent 7e739b6 commit eefb386
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 13 deletions.
29 changes: 16 additions & 13 deletions src/NiceNumbers.jl
Expand Up @@ -65,15 +65,6 @@ struct NotNiceError <: Exception
end
showerror(io::IO, e::NotNiceError) = print(io, e.expr, " is not nice anymore!")

# always promote to NiceNumber; if that can't be done, it can't be nice
promote_rule(::Type{NiceNumber}, ::Type{T}) where {T<:Number} = NiceNumber
one(::NiceNumber) = NiceNumber(1, 0, 0)
zero(::NiceNumber) = NiceNumber(0, 0, 0)

AbstractFloat(n::NiceNumber) = float(n.a) + float(n.coeff) * n.radicand
(::Type{T})(n::NiceNumber) where {T<:AbstractFloat} =
convert(T, n.a) + convert(T, n.coeff) * convert(T, n.radicand)

"""
isrational(n::NiceNumber)
Expand All @@ -85,6 +76,7 @@ isfinite(n::NiceNumber) = isfinite(n.a) && isfinite(n.coeff)
isreal(n::NiceNumber) = n.radicand >= 0
real(n::NiceNumber) = isreal(n) ? n : NiceNumber(n.a)
imag(n::NiceNumber) = isreal(n) ? zero(n) : NiceNumber(0,n.coeff,-n.radicand)
checkreal(n::NiceNumber) = isreal(n) || throw(DomainError(n, "Need a real number for this."))

function Base.show(io::IO, n::NiceNumber)
pretty(r::Rational) = isinteger(r) ? numerator(r) : r
Expand All @@ -105,7 +97,18 @@ function Base.show(io::IO, n::NiceNumber)
end
Base.show(io::IO, ::MIME"text/plain", n::NiceNumber) = print(io, "Nice number:\n ", n)

+(n::NiceNumber) = n
## Promotion & Conversion
# always promote to NiceNumber; if that can't be done, it can't be nice
promote_rule(::Type{NiceNumber}, ::Type{T}) where {T<:Number} = NiceNumber
one(::NiceNumber) = NiceNumber(1, 0, 0)
zero(::NiceNumber) = NiceNumber(0, 0, 0)

AbstractFloat(n::NiceNumber) = checkreal(n) && float(n.a) + float(n.coeff) * n.radicand
(::Type{T})(n::NiceNumber) where {T<:AbstractFloat} =
checkreal(n) && convert(T, n.a) + convert(T, n.coeff) * convert(T, n.radicand)

## Arithmetic
# +(n::NiceNumber) = n # already in Base for <:Number
-(n::NiceNumber) = NiceNumber(-n.a, -n.coeff, n.radicand)
function +(n::NiceNumber, m::NiceNumber)
if !(n.radicand == m.radicand || isrational(n) || isrational(m))
Expand Down Expand Up @@ -157,9 +160,9 @@ end
# TODO: think about comparisons more (or less)
isless(n::NiceNumber, m::NiceNumber) = float(n) < float(m)
isless(n::Real, m::NiceNumber) = n < float(m)
isless(n::NiceNumber, m::Real) = !isless(m,n)
<(n::NiceNumber, m::NiceNumber) = float(n) < float(m)
<=(n::NiceNumber, m::NiceNumber) = n === m || n < m
isless(n::NiceNumber, m::Real) = float(n) < m
# <(n::NiceNumber, m::NiceNumber) = float(n) < float(m) # falls back to isless
# <=(n::NiceNumber, m::NiceNumber) = n === m || n < m # fallback already in Base
==(n::NiceNumber, m::AbstractFloat) = float(n) == m
==(m::AbstractFloat, n::NiceNumber) = n == m
hash(n::NiceNumber, h::UInt) = hash(n.a, hash(n.coeff, hash(n.radicand, hash(:NiceNumber, h))))
Expand Down
1 change: 1 addition & 0 deletions test/runtests.jl
Expand Up @@ -69,6 +69,7 @@ end
@test NiceNumber(5, 1, 2) > 5
@test NiceNumber(13, 3, 7) == 13 + 3 * 7
@test 13 + 3 * 7 == NiceNumber(13, 3, 7)
@test !(NiceNumber(7) < 7) # issue #7
end

@testset "Conversion" begin
Expand Down

0 comments on commit eefb386

Please sign in to comment.