Skip to content

Commit 5d50bf9

Browse files
author
oscarddssmith
committed
further cleanup
1 parent 848a168 commit 5d50bf9

File tree

2 files changed

+19
-75
lines changed

2 files changed

+19
-75
lines changed

src/Quadmath.jl

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -198,8 +198,10 @@ Float128(x::Bool) = x ? Float128(1) : Float128(0)
198198
@assume_effects :foldable (/)(x::Float128, y::Float128) =
199199
Float128(@quad_ccall(quadoplib.__divtf3(x::Cfloat128, y::Cfloat128)::Cfloat128))
200200

201-
@assume_effects :foldable (-)(x::Float128) =
202-
Float128(@quad_ccall(quadoplib.__negtf2(x::Cfloat128)::Cfloat128))
201+
function (-)(x::Float128)
202+
# xor by sign
203+
reinterpret(Float128, reinterpret(UInt128, x) sign_mask(Float128))
204+
end
203205

204206
# Float128 -> Integer
205207
function unsafe_trunc(::Type{T}, x::Float128) where T<:Base.BitUnsigned
@@ -296,7 +298,7 @@ end
296298

297299
function abs(x::Float128)
298300
# mask out sign
299-
reinterpret(Float128, reinterpret(UInt128, x)&(~(UInt128(1)<<127)))
301+
reinterpret(Float128, reinterpret(UInt128, x)&(~sign_mask(Float128)))
300302
end
301303
@assume_effects :foldable round(x::Float128) = Float128(@quad_ccall(libquadmath.rintq(x::Cfloat128)::Cfloat128))
302304
round(x::Float128, r::RoundingMode{:Down}) = floor(x)
@@ -329,6 +331,16 @@ Base.Integer(x::Float128) = Int(x)
329331
sincos(x::Float128) = (sin(x), cos(x))
330332

331333
## misc
334+
335+
"""
336+
Inf128
337+
338+
Positive infinity of type [`Float128`](@ref).
339+
"""
340+
const Inf128 = reinterpret(Float128, exponent_mask(Float128))
341+
typemax(::Type{Float128}) = Inf128
342+
typemin(::Type{Float128}) = -Inf128
343+
332344
@static if !Sys.iswindows()
333345
# disable fma on Windows until rounding mode issue fixed
334346
# https://github.com/JuliaMath/Quadmath.jl/issues/31
@@ -337,9 +349,7 @@ sincos(x::Float128) = (sin(x), cos(x))
337349
end
338350

339351
function isinf(x::Float128)
340-
xu = reinterpret(UInt128, x)
341-
# xu must be either 0x7fff_0000... or 0xffff_0000...
342-
return xu in (exponent_mask(Float128), exponent_mask(Float128)&~(UInt128(1)<<127))
352+
return x===Inf128 || x===-Inf128
343353
end
344354
function isfinite(x::Float128)
345355
xu = reinterpret(UInt128, x)
@@ -360,15 +370,6 @@ floatmin(::Type{Float128}) = reinterpret(Float128, 0x0001_0000_0000_0000_0000_00
360370
floatmax(::Type{Float128}) = reinterpret(Float128, 0x7ffe_ffff_ffff_ffff_ffff_ffff_ffff_ffff)
361371
maxintfloat(::Type{Float128}) = Float128(0x0002_0000_0000_0000_0000_0000_0000_0000)
362372

363-
"""
364-
Inf128
365-
366-
Positive infinity of type [`Float128`](@ref).
367-
"""
368-
const Inf128 = reinterpret(Float128, 0x7fff_0000_0000_0000_0000_0000_0000_0000)
369-
typemax(::Type{Float128}) = Inf128
370-
typemin(::Type{Float128}) = -Inf128
371-
372373
@assume_effects :foldable ldexp(x::Float128, n::Cint) =
373374
Float128(@quad_ccall(libquadmath.ldexpq(x::Cfloat128, n::Cint)::Cfloat128))
374375
ldexp(x::Float128, n::Integer) =

src/printf.jl

Lines changed: 3 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -1,60 +1,3 @@
1-
2-
3-
if VERSION < v"1.6.0-beta"
4-
import Printf: ini_dec, fix_dec, ini_hex, ini_HEX
5-
6-
function fp128_printf(out, d::Float128, flags::String, width::Int, precision::Int, c::Char, digits)
7-
fmt_len = sizeof(flags)+4
8-
if width > 0
9-
fmt_len += ndigits(width)
10-
end
11-
if precision >= 0
12-
fmt_len += ndigits(precision)+1
13-
end
14-
fmt = IOBuffer(maxsize=fmt_len)
15-
print(fmt, '%')
16-
print(fmt, flags)
17-
if width > 0
18-
print(fmt, width)
19-
end
20-
if precision == 0
21-
print(fmt, '.')
22-
print(fmt, '0')
23-
elseif precision > 0
24-
print(fmt, '.')
25-
print(fmt, precision)
26-
end
27-
print(fmt, 'Q')
28-
print(fmt, c)
29-
write(fmt, UInt8(0))
30-
printf_fmt = take!(fmt)
31-
@assert length(printf_fmt) == fmt_len
32-
bufsiz = length(digits)
33-
lng = @ccall(libquadmath.quadmath_snprintf(digits::Ptr{UInt8}, bufsiz::Csize_t, printf_fmt::Ptr{UInt8}, d::(Cfloat128...))::Cint)
34-
lng > 0 || error("invalid printf formatting for Float128")
35-
unsafe_write(out, pointer(digits), min(lng, bufsiz-1))
36-
return (false, ())
37-
end
38-
39-
if VERSION < v"1.1"
40-
using Base.Grisu: DIGITSs
41-
fix_dec(out, d::Float128, flags::String, width::Int, precision::Int, c::Char) = fp128_printf(out, d, flags, width, precision, c, DIGITSs[Threads.threadid()])
42-
ini_dec(out, d::Float128, ndigits::Int, flags::String, width::Int, precision::Int, c::Char) = fp128_printf(out, d, flags, width, precision, c, DIGITSs[Threads.threadid()])
43-
ini_hex(out, d::Float128, ndigits::Int, flags::String, width::Int, precision::Int, c::Char) = fp128_printf(out, d, flags, width, precision, c, DIGITSs[Threads.threadid()])
44-
ini_HEX(out, d::Float128, ndigits::Int, flags::String, width::Int, precision::Int, c::Char) = fp128_printf(out, d, flags, width, precision, c, DIGITSs[Threads.threadid()])
45-
ini_hex(out, d::Float128, flags::String, width::Int, precision::Int, c::Char) = fp128_printf(out, d, flags, width, precision, c, DIGITSs[Threads.threadid()])
46-
ini_HEX(out, d::Float128, flags::String, width::Int, precision::Int, c::Char) = fp128_printf(out, d, flags, width, precision, c, DIGITSs[Threads.threadid()])
47-
else
48-
fix_dec(out, d::Float128, flags::String, width::Int, precision::Int, c::Char, digits) = fp128_printf(out, d, flags, width, precision, c, digits)
49-
ini_dec(out, d::Float128, ndigits::Int, flags::String, width::Int, precision::Int, c::Char, digits) = fp128_printf(out, d, flags, width, precision, c, digits)
50-
ini_hex(out, d::Float128, ndigits::Int, flags::String, width::Int, precision::Int, c::Char, digits) = fp128_printf(out, d, flags, width, precision, c, digits)
51-
ini_HEX(out, d::Float128, ndigits::Int, flags::String, width::Int, precision::Int, c::Char, digits) = fp128_printf(out, d, flags, width, precision, c, digits)
52-
ini_hex(out, d::Float128, flags::String, width::Int, precision::Int, c::Char, digits) = fp128_printf(out, d, flags, width, precision, c, digits)
53-
ini_HEX(out, d::Float128, flags::String, width::Int, precision::Int, c::Char, digits) = fp128_printf(out, d, flags, width, precision, c, digits)
54-
end
55-
else
56-
# Julia v1.6+
57-
# placeholder
58-
import Printf
59-
Printf.tofloat(x::Float128) = BigFloat(x)
60-
end
1+
# placeholder
2+
import Printf
3+
Printf.tofloat(x::Float128) = BigFloat(x)

0 commit comments

Comments
 (0)