diff --git a/src/math.jl b/src/math.jl index 4662ab02..736aeacf 100644 --- a/src/math.jl +++ b/src/math.jl @@ -16,8 +16,28 @@ Base.:/(l::Number, r::Quantity) = l * inv(r) Base.:/(l::Dimensions, r::Number) = Quantity(inv(r), l) Base.:/(l::Number, r::Dimensions) = Quantity(l, inv(r)) -Base.:+(l::Quantity, r::Quantity) = dimension(l) == dimension(r) ? Quantity(l.value + r.value, l.dimensions) : throw(DimensionError(l, r)) -Base.:-(l::Quantity, r::Quantity) = dimension(l) == dimension(r) ? Quantity(l.value - r.value, l.dimensions) : throw(DimensionError(l, r)) +function Base.:+(l::Quantity, r::Quantity) + if iszero(l) + return r + elseif iszero(r) + return l + else + l.dimensions == r.dimensions ? Quantity(l.value + r.value, l.dimensions) : throw(DimensionError(l, r)) + end +end + + +function Base.:-(l::Quantity, r::Quantity) + if iszero(l) + return -r + elseif iszero(r) + return l + else + l.dimensions == r.dimensions ? Quantity(l.value - r.value, l.dimensions) : throw(DimensionError(l, r)) + end +end + +Base.:-(l::Quantity) = Quantity(- l.value, l.dimensions) _pow(l::Dimensions{R}, r::R) where {R} = @map_dimensions(Base.Fix1(*, r), l) _pow(l::Quantity{T,R}, r::R) where {T,R} = Quantity(l.value^convert(T, r), _pow(l.dimensions, r)) @@ -32,4 +52,16 @@ Base.sqrt(q::Quantity) = Quantity(sqrt(q.value), sqrt(q.dimensions)) Base.cbrt(d::Dimensions{R}) where {R} = d^inv(convert(R, 3)) Base.cbrt(q::Quantity) = Quantity(cbrt(q.value), cbrt(q.dimensions)) -Base.abs(q::Quantity) = Quantity(abs(q.value), q.dimensions) + +# +# We need this for pivoting: we could introduce a pivoting type RowNonZero instead. +# +#Base.abs(q::Quantity) = Quantity(abs(q.value), q.dimensions, q.valid) +Base.abs(q::Quantity) = Quantity(abs(q.value)) + + +Base.iszero(d::Dimensions) = d==Dimensions() +Base.isless(q::Quantity,r::Quantity) = q.value