Skip to content

Commit d73ca7e

Browse files
RalphASsimonbyrne
andauthored
Fixes for Julia v1.6 (#51)
* hash tests: only enforce one-way implication The integer hash used in Julia v1.6 breaks our previous incorrect assumption that hash equality ==> equality, so tests must be revised. * use Big fallback for printf under Julia v1.6-beta the switch from Grisu to Ryu also changed the Printf ABI. Until we have time to stuff the libquadmath formatter into the new logic, this will keep things running (slowly). * update versions for CI * Rearrange version branches Co-authored-by: Simon Byrne <simonbyrne@gmail.com>
1 parent c6f2ea2 commit d73ca7e

File tree

5 files changed

+62
-54
lines changed

5 files changed

+62
-54
lines changed

.github/workflows/CI.yml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,9 @@ jobs:
1414
matrix:
1515
version:
1616
- '1.0'
17-
- '1.2'
18-
# - 'nightly'
17+
- '1.5'
18+
- '1.6'
19+
- 'nightly'
1920
os:
2021
- ubuntu-latest
2122
- macOS-latest

Project.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
name = "Quadmath"
22
uuid = "be4d8f0f-7fa4-5f49-b795-2f01399ab2dd"
3-
version = "0.5.4"
3+
version = "0.5.5-DEV"
44

55
[deps]
66
Printf = "de0858da-6303-5e67-8744-51eddeeeb8d7"

README.md

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
# Quadmath.jl
22

3-
[![Travis Build Status](https://travis-ci.org/JuliaMath/Quadmath.jl.svg?branch=master)](https://travis-ci.org/JuliaMath/Quadmath.jl)
4-
[![Appveyor Build status](https://ci.appveyor.com/api/projects/status/wx46vbwmu2ey5qkj/branch/master?svg=true)](https://ci.appveyor.com/project/simonbyrne/quadmath-jl/branch/master)
3+
[![GitHub CI Build Status](https://github.com/JuliaMath/Quadmath.jl/workflows/CI/badge.svg)](https://github.com/JuliaMath/Quadmath.jl/actions)
54

65
This is a Julia interface to libquadmath, providing a `Float128` type corresponding to the IEEE754 binary128 floating point format.
76

src/printf.jl

Lines changed: 55 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1,51 +1,60 @@
1-
import Printf: ini_dec, fix_dec, ini_hex, ini_HEX
21

3-
if VERSION < v"1.1"
4-
using Base.Grisu: DIGITSs
5-
fix_dec(out, d::Float128, flags::String, width::Int, precision::Int, c::Char) = fp128_printf(out, d, flags, width, precision, c, DIGITSs[Threads.threadid()])
6-
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()])
7-
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()])
8-
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()])
9-
ini_hex(out, d::Float128, flags::String, width::Int, precision::Int, c::Char) = fp128_printf(out, d, flags, width, precision, c, DIGITSs[Threads.threadid()])
10-
ini_HEX(out, d::Float128, flags::String, width::Int, precision::Int, c::Char) = fp128_printf(out, d, flags, width, precision, c, DIGITSs[Threads.threadid()])
11-
else
12-
fix_dec(out, d::Float128, flags::String, width::Int, precision::Int, c::Char, digits) = fp128_printf(out, d, flags, width, precision, c, digits)
13-
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)
14-
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)
15-
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)
16-
ini_hex(out, d::Float128, flags::String, width::Int, precision::Int, c::Char, digits) = fp128_printf(out, d, flags, width, precision, c, digits)
17-
ini_HEX(out, d::Float128, flags::String, width::Int, precision::Int, c::Char, digits) = fp128_printf(out, d, flags, width, precision, c, digits)
18-
end
192

20-
function fp128_printf(out, d::Float128, flags::String, width::Int, precision::Int, c::Char, digits)
21-
fmt_len = sizeof(flags)+4
22-
if width > 0
23-
fmt_len += ndigits(width)
24-
end
25-
if precision >= 0
26-
fmt_len += ndigits(precision)+1
27-
end
28-
fmt = IOBuffer(maxsize=fmt_len)
29-
print(fmt, '%')
30-
print(fmt, flags)
31-
if width > 0
32-
print(fmt, width)
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, ())
3337
end
34-
if precision == 0
35-
print(fmt, '.')
36-
print(fmt, '0')
37-
elseif precision > 0
38-
print(fmt, '.')
39-
print(fmt, precision)
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)
4054
end
41-
print(fmt, 'Q')
42-
print(fmt, c)
43-
write(fmt, UInt8(0))
44-
printf_fmt = take!(fmt)
45-
@assert length(printf_fmt) == fmt_len
46-
bufsiz = length(digits)
47-
lng = @ccall(libquadmath.quadmath_snprintf(digits::Ptr{UInt8}, bufsiz::Csize_t, printf_fmt::Ptr{UInt8}, d::(Cfloat128...))::Cint)
48-
lng > 0 || error("invalid printf formatting for Float128")
49-
unsafe_write(out, pointer(digits), min(lng, bufsiz-1))
50-
return (false, ())
55+
else
56+
# Julia v1.6+
57+
# placeholder
58+
import Printf
59+
Printf.tofloat(x::Float128) = BigFloat(x)
5160
end

test/hashing.jl

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,7 @@ end
4343
a = coerce(T, x),
4444
b = coerce(S, x)
4545
T == Float128 || S == Float128 || continue # other types are not our problem
46-
#println("$(typeof(a)) $a")
47-
#println("$(typeof(b)) $b")
48-
@test isequal(a,b) == (hash(a)==hash(b))
46+
# equality must imply same hash; converse is not guaranteed
47+
@test !(isequal(a,b) && (hash(a) != hash(b)))
4948
end
5049
end

0 commit comments

Comments
 (0)