Skip to content

Commit

Permalink
add div function for BigFloats
Browse files Browse the repository at this point in the history
  • Loading branch information
simonbyrne committed Jun 29, 2015
1 parent 1544e4e commit 377fe4c
Show file tree
Hide file tree
Showing 2 changed files with 69 additions and 1 deletion.
61 changes: 60 additions & 1 deletion base/mpfr.jl
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ export

import
Base: (*), +, -, /, <, <=, ==, >, >=, ^, besselj, besselj0, besselj1, bessely,
bessely0, bessely1, ceil, cmp, convert, copysign, deg2rad,
bessely0, bessely1, ceil, cmp, convert, copysign, deg2rad, div,
exp, exp2, exponent, factorial, floor, fma, hypot, isinteger,
isfinite, isinf, isnan, ldexp, log, log2, log10, max, min, mod, modf,
nextfloat, prevfloat, promote_rule, rad2deg, rem, round, show,
Expand Down Expand Up @@ -309,6 +309,65 @@ function fma(x::BigFloat, y::BigFloat, z::BigFloat)
return r
end

# div
# BigFloat
function div(x::BigFloat, y::BigFloat)
z = BigFloat()
ccall((:mpfr_div,:libmpfr), Int32, (Ptr{BigFloat}, Ptr{BigFloat}, Ptr{BigFloat}, Int32), &z, &x, &y, to_mpfr(RoundToZero))
ccall((:mpfr_trunc, :libmpfr), Int32, (Ptr{BigFloat}, Ptr{BigFloat}), &z, &z)
return z
end

# Unsigned Int
function div(x::BigFloat, c::CulongMax)
z = BigFloat()
ccall(($(string(:mpfr_div_ui)), :libmpfr), Int32, (Ptr{BigFloat}, Ptr{BigFloat}, Culong, Int32), &z, &x, c, to_mpfr(RoundToZero))
ccall((:mpfr_trunc, :libmpfr), Int32, (Ptr{BigFloat}, Ptr{BigFloat}), &z, &z)
return z
end
function div(c::CulongMax, x::BigFloat)
z = BigFloat()
ccall((:mpfr_ui_div, :libmpfr), Int32, (Ptr{BigFloat}, Culong, Ptr{BigFloat}, Int32), &z, c, &x, to_mpfr(RoundToZero))
ccall((:mpfr_trunc, :libmpfr), Int32, (Ptr{BigFloat}, Ptr{BigFloat}), &z, &z)
return z
end

# Signed Integer
function div(x::BigFloat, c::ClongMax)
z = BigFloat()
ccall((:mpfr_div_si, :libmpfr), Int32, (Ptr{BigFloat}, Ptr{BigFloat}, Clong, Int32), &z, &x, c, to_mpfr(RoundToZero))
ccall((:mpfr_trunc, :libmpfr), Int32, (Ptr{BigFloat}, Ptr{BigFloat}), &z, &z)
return z
end
function div(c::ClongMax, x::BigFloat)
z = BigFloat()
ccall((:mpfr_si_div, :libmpfr), Int32, (Ptr{BigFloat}, Clong, Ptr{BigFloat}, Int32), &z, c, &x, to_mpfr(RoundToZero))
ccall((:mpfr_trunc, :libmpfr), Int32, (Ptr{BigFloat}, Ptr{BigFloat}), &z, &z)
return z
end

# Float32/Float64
function div(x::BigFloat, c::CdoubleMax)
z = BigFloat()
ccall((:mpfr_div_d, :libmpfr), Int32, (Ptr{BigFloat}, Ptr{BigFloat}, Cdouble, Int32), &z, &x, c, to_mpfr(RoundToZero))
ccall((:mpfr_trunc, :libmpfr), Int32, (Ptr{BigFloat}, Ptr{BigFloat}), &z, &z)
return z
end
function div(c::CdoubleMax, x::BigFloat)
z = BigFloat()
ccall((:mpfr_d_div, :libmpfr), Int32, (Ptr{BigFloat}, Cdouble, Ptr{BigFloat}, Int32), &z, c, &x, to_mpfr(RoundToZero))
ccall((:mpfr_trunc, :libmpfr), Int32, (Ptr{BigFloat}, Ptr{BigFloat}), &z, &z)
return z
end

# BigInt
function div(x::BigFloat, c::BigInt)
z = BigFloat()
ccall((:mpfr_div_z, :libmpfr), Int32, (Ptr{BigFloat}, Ptr{BigFloat}, Ptr{BigInt}, Int32), &z, &x, &c, to_mpfr(RoundToZero))
ccall((:mpfr_trunc, :libmpfr), Int32, (Ptr{BigFloat}, Ptr{BigFloat}), &z, &z)
return z
end



# More efficient commutative operations
Expand Down
9 changes: 9 additions & 0 deletions test/mpfr.jl
Original file line number Diff line number Diff line change
Expand Up @@ -729,6 +729,15 @@ f = parse(BigFloat,"6.2230152778611417071440640537801242405902521687211671331011
# BigInt division
@test a / BigInt(2) == c

# div
@test div(big"1.0",big"0.1") == 9
@test div(1,big"0.1") == 9
@test div(1.0,big"0.1") == 9
@test div(big"1.0",0.1) == 9
@test div(big"1",big"0.1") == 9
@test div(big"1",0.1) == 9


# old tests
tol = 1e-12

Expand Down

0 comments on commit 377fe4c

Please sign in to comment.