jump-dev / MutableArithmetics.jl

Interface for arithmetics on mutable types in Julia
Mozilla Public License 2.0
50 stars 8 forks source link

`DivideError` in `mutability(T, div, T, T)`, where `T == Rational{BigInt}` #240

Open nsajko opened 11 months ago

nsajko commented 11 months ago
julia> import MutableArithmetics

julia> f(op::F, ::Type{T}) where {F, T} = MutableArithmetics.mutability(T, op, T, T)
f (generic function with 1 method)

julia> f(/, BigInt)
MutableArithmetics.IsNotMutable()

julia> f(div, BigInt)
MutableArithmetics.IsMutable()

julia> f(/, Rational{BigInt})
MutableArithmetics.IsMutable()

julia> f(div, Rational{BigInt})
ERROR: DivideError: integer division error
Stacktrace:
  [1] tdiv_q!(x::BigInt, a::BigInt, b::BigInt)
    @ Base.GMP.MPZ ./gmp.jl:165
  [2] tdiv_q
    @ ./gmp.jl:166 [inlined]
  [3] div
    @ ./gmp.jl:508 [inlined]
  [4] div
    @ ./gmp.jl:512 [inlined]
  [5] divgcd(x::BigInt, y::BigInt)
    @ Base ./rational.jl:43
  [6] div(x::Rational{BigInt}, y::Rational{BigInt}, r::RoundingMode{:ToZero})
    @ Base ./rational.jl:481
  [7] div
    @ Base ./rational.jl:488 [inlined]
  [8] div
    @ Base ./rational.jl:492 [inlined]
  [9] promote_operation_fallback
    @ MutableArithmetics ~/tmp/jl/MutableArithmetics.jl/src/interface.jl:51 [inlined]
 [10] promote_operation
    @ MutableArithmetics ~/tmp/jl/MutableArithmetics.jl/src/interface.jl:113 [inlined]
 [11] mutability
    @ MutableArithmetics ~/tmp/jl/MutableArithmetics.jl/src/interface.jl:266 [inlined]
 [12] f(op::typeof(div), ::Type{Rational{BigInt}})
    @ Main ./REPL[2]:1
 [13] top-level scope
    @ REPL[6]:1

(@v1.11) pkg> st MutableArithmetics
Status `~/.julia/environments/v1.11/Project.toml`
  [d8a4904e] MutableArithmetics v1.3.3 `~/tmp/jl/MutableArithmetics.jl`
blegat commented 11 months ago

It's just missing a promote_operation method it seems. By the way if you're interested in rational mutable arithmetics, there is a WIP PR in https://github.com/jump-dev/MutableArithmetics.jl/pull/141/