From 0c90288581e93762aa900b7c1f8ef95ba8d28de5 Mon Sep 17 00:00:00 2001 From: John M Kuhn Date: Sun, 10 May 2020 01:35:01 -0400 Subject: [PATCH] Constructors with RoundingMode --- src/DecFP.jl | 13 +++++++++++++ test/runtests.jl | 17 +++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/src/DecFP.jl b/src/DecFP.jl index d0042cc..24b2820 100644 --- a/src/DecFP.jl +++ b/src/DecFP.jl @@ -117,6 +117,13 @@ for w in (32,64,128) $BID(x::Number) = convert($BID, x) Base.reinterpret(::Type{$BID}, x::$Ti) = new(x) end + + @eval function $BID(x::Real, mode::RoundingMode) + setrounding($BID, mode) do + convert($BID, x) + end + end + # fix method ambiguities: @eval $BID(x::Rational{T}) where {T} = convert($BID, x) end @@ -209,6 +216,12 @@ for w in (32,64,128) $BID(x::AbstractString) = parse($BID, x) + function $BID(x::AbstractString, mode::RoundingMode) + setrounding($BID, mode) do + parse($BID, x) + end + end + function tostring(x::$BID) # fills global _buffer ccall(($(bidsym(w,"to_string")), libbid), Cvoid, (Ptr{UInt8},$BID,Ref{Cuint}), _buffer[Threads.threadid()], x, RefArray(flags, Threads.threadid())) diff --git a/test/runtests.jl b/test/runtests.jl index f0f1417..3bddae7 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -51,6 +51,23 @@ for T in (Dec32, Dec64, Dec128) @test parse(T, "0.1")::T == T(1//10) @test T("0.1")::T == T(1//10) + if T != Dec128 + @test T(0.1) == T("0.1") + @test T(0.1, RoundNearest) == T("0.1") + @test T(0.1, RoundDown) == T("0.1") + @test T(0.1, RoundUp) == nextfloat(T("0.1")) + end + @test T("1", RoundDown) == T(1) + @test T("1", RoundUp) == T(1) + @test T("1.0000000000000000000000000000000000000001") == T(1) + @test T("1.0000000000000000000000000000000000000001", RoundNearest) == T(1) + @test T("1.0000000000000000000000000000000000000001", RoundDown) == T(1) + @test T("1.0000000000000000000000000000000000000001", RoundUp) == nextfloat(T(1)) + @test T("0.9999999999999999999999999999999999999999") == T(1) + @test T("0.9999999999999999999999999999999999999999", RoundNearest) == T(1) + @test T("0.9999999999999999999999999999999999999999", RoundUp) == T(1) + @test T("0.9999999999999999999999999999999999999999", RoundDown) == prevfloat(T(1)) + io = IOBuffer() show(io, T("NaN")); @test String(take!(io)) == "NaN" show(io, T("Inf")); @test String(take!(io)) == "Inf"