From 73c4890e3bff6d2fd9ff52bacea24833abd9e58f Mon Sep 17 00:00:00 2001 From: Jacob Quinn Date: Thu, 10 Sep 2020 06:34:17 -0600 Subject: [PATCH] Delete remaining grisu files; mentioned in #37506 --- base/grisu/grisu.jl | 216 ------ test/grisu.jl | 1764 ------------------------------------------- 2 files changed, 1980 deletions(-) delete mode 100644 base/grisu/grisu.jl delete mode 100644 test/grisu.jl diff --git a/base/grisu/grisu.jl b/base/grisu/grisu.jl deleted file mode 100644 index a311c15b94bb1..0000000000000 --- a/base/grisu/grisu.jl +++ /dev/null @@ -1,216 +0,0 @@ -# This file is a part of Julia. License is MIT: https://julialang.org/license - -module Grisu - -export print_shortest -export DIGITS, DIGITSs, grisu - -const SHORTEST = 1 -const FIXED = 2 -const PRECISION = 3 - -include("grisu/float.jl") -include("grisu/fastshortest.jl") -include("grisu/fastprecision.jl") -include("grisu/fastfixed.jl") -include("grisu/bignums.jl") -include("grisu/bignum.jl") - -const DIGITS = Vector{UInt8}(undef, 309+17) -const BIGNUMS = [Bignums.Bignum(),Bignums.Bignum(),Bignums.Bignum(),Bignums.Bignum()] - -# NOTE: DIGITS[s] is deprecated; you should use getbuf() instead. -const DIGITSs = [DIGITS] -const BIGNUMSs = [BIGNUMS] -function __init__() - Threads.resize_nthreads!(DIGITSs) - Threads.resize_nthreads!(BIGNUMSs) -end - -function getbuf() - tls = task_local_storage() - d = get(tls, :DIGITS, nothing) - if d === nothing - d = Vector{UInt8}(undef, 309+17) - tls[:DIGITS] = d - end - return d::Vector{UInt8} -end - -""" - (len, point, neg) = Grisu.grisu(v::AbstractFloat, mode, requested_digits, [buffer], [bignums]) - -Convert the number `v` to decimal using the Grisu algorithm. - -`mode` can be one of: - - `Grisu.SHORTEST`: convert to the shortest decimal representation which can be "round-tripped" back to `v`. - - `Grisu.FIXED`: round to `requested_digits` digits. - - `Grisu.PRECISION`: round to `requested_digits` significant digits. - -The characters are written as bytes to `buffer`, with a terminating NUL byte, and `bignums` are used internally as part of the correction step. You can call `Grisu.getbuf()` to obtain a suitable task-local buffer. - -The returned tuple contains: - - - `len`: the number of digits written to `buffer` (excluding NUL) - - `point`: the location of the radix point relative to the start of the array (e.g. if - `point == 3`, then the radix point should be inserted between the 3rd and 4th - digit). Note that this can be negative (for very small values), or greater than `len` - (for very large values). - - `neg`: the signbit of `v` (see [`signbit`](@ref)). -""" -function grisu(v::AbstractFloat,mode,requested_digits,buffer=DIGITSs[Threads.threadid()],bignums=BIGNUMSs[Threads.threadid()]) - if signbit(v) - neg = true - v = -v - else - neg = false - end - if mode == PRECISION && requested_digits == 0 - buffer[1] = 0x00 - len = 0 - return 0, 0, neg - end - if v == 0.0 - buffer[1] = 0x30 - buffer[2] = 0x00 - len = point = 1 - return len, point, neg - end - if mode == SHORTEST - status,len,point = fastshortest(v,buffer) - elseif mode == FIXED - status,len,point = fastfixedtoa(v,0,requested_digits,buffer) - elseif mode == PRECISION - status,len,point = fastprecision(v,requested_digits,buffer) - end - status && return len-1, point, neg - status, len, point = bignumdtoa(v,mode,requested_digits,buffer,bignums) - return len-1, point, neg -end - -nanstr(x::AbstractFloat) = "NaN" -nanstr(x::Float32) = "NaN32" -nanstr(x::Float16) = "NaN16" -infstr(x::AbstractFloat) = "Inf" -infstr(x::Float32) = "Inf32" -infstr(x::Float16) = "Inf16" - -function _show(io::IO, x::AbstractFloat, mode, n::Int, typed, compact) - isnan(x) && return print(io, typed ? nanstr(x) : "NaN") - if isinf(x) - signbit(x) && print(io,'-') - print(io, typed ? infstr(x) : "Inf") - return - end - typed && isa(x,Float16) && print(io, "Float16(") - buffer = getbuf() - len, pt, neg = grisu(x,mode,n,buffer) - pdigits = pointer(buffer) - if mode == PRECISION - while len > 1 && buffer[len] == 0x30 - len -= 1 - end - end - neg && print(io,'-') - exp_form = pt <= -4 || pt > 6 - exp_form = exp_form || (pt >= len && abs(mod(x + 0.05, 10^(pt - len)) - 0.05) > 0.05) # see issue #6608 - if exp_form # .00001 to 100000. - # => #.#######e### - # assumes ASCII/UTF8 encoding of digits is okay for out: - unsafe_write(io, pdigits, 1) - print(io, '.') - if len > 1 - unsafe_write(io, pdigits+1, len-1) - else - print(io, '0') - end - print(io, (typed && isa(x,Float32)) ? 'f' : 'e') - print(io, string(pt - 1)) - typed && isa(x,Float16) && print(io, ")") - return - elseif pt <= 0 - # => 0.00######## - print(io, "0.") - while pt < 0 - print(io, '0') - pt += 1 - end - unsafe_write(io, pdigits, len) - elseif pt >= len - # => ########00.0 - unsafe_write(io, pdigits, len) - while pt > len - print(io, '0') - len += 1 - end - print(io, ".0") - else # => ####.#### - unsafe_write(io, pdigits, pt) - print(io, '.') - unsafe_write(io, pdigits+pt, len-pt) - end - typed && !compact && isa(x,Float32) && print(io, "f0") - typed && isa(x,Float16) && print(io, ")") - nothing -end - -# normal: -# 0 < pt < len ####.#### len+1 -# pt <= 0 0.000######## len-pt+1 -# len <= pt (dot) ########000. pt+1 -# len <= pt (no dot) ########000 pt -# exponential: -# pt <= 0 ########e-### len+k+2 -# 0 < pt ########e### len+k+1 - -function _print_shortest(io::IO, x::AbstractFloat, dot::Bool, mode, n::Int) - isnan(x) && return print(io, "NaN") - x < 0 && print(io,'-') - isinf(x) && return print(io, "Inf") - buffer = getbuf() - len, pt, neg = grisu(x,mode,n,buffer) - pdigits = pointer(buffer) - e = pt-len - k = -9<=e<=9 ? 1 : 2 - if -pt > k+1 || e+dot > k+1 - # => ########e### - unsafe_write(io, pdigits+0, len) - print(io, 'e') - print(io, string(e)) - return - elseif pt <= 0 - # => 0.000######## - print(io, "0.") - while pt < 0 - print(io, '0') - pt += 1 - end - unsafe_write(io, pdigits+0, len) - elseif e >= dot - # => ########000. - unsafe_write(io, pdigits+0, len) - while e > 0 - print(io, '0') - e -= 1 - end - if dot - print(io, '.') - end - else # => ####.#### - unsafe_write(io, pdigits+0, pt) - print(io, '.') - unsafe_write(io, pdigits+pt, len-pt) - end - nothing -end - -""" - print_shortest(io::IO, x) - -Print the shortest possible representation, with the minimum number of consecutive non-zero -digits, of number `x`, ensuring that it would parse to the exact same number. -""" -print_shortest(io::IO, x::AbstractFloat, dot::Bool) = _print_shortest(io, x, dot, SHORTEST, 0) -print_shortest(io::IO, x::Union{AbstractFloat,Integer}) = print_shortest(io, float(x), false) - -end # module diff --git a/test/grisu.jl b/test/grisu.jl deleted file mode 100644 index 46e9eabe9e7d4..0000000000000 --- a/test/grisu.jl +++ /dev/null @@ -1,1764 +0,0 @@ -# This file is a part of Julia. License is MIT: https://julialang.org/license - -using Base.Grisu - -function trimrep(buffer) - len = length(unsafe_string(pointer(buffer))) - ind = len - for i = len:-1:1 - buffer[i] != 0x30 && break - ind -= 1 - end - buffer[ind+1] = 0 - return unsafe_string(pointer(buffer)) -end - -const bufsize = 500 -buffer = Vector{UInt8}(undef, bufsize) -fill!(buffer,0) -bignums = [Grisu.Bignums.Bignum(),Grisu.Bignums.Bignum(),Grisu.Bignums.Bignum(),Grisu.Bignums.Bignum()] - -# Start by checking the byte-order. -ordered = 0x0123456789ABCDEF -@test 3512700564088504e-318 == reinterpret(Float64,ordered) - -min_double64 = 0x0000000000000001 -@test 5e-324 == reinterpret(Float64,min_double64) - -max_double64 = 0x7fefffffffffffff -@test 1.7976931348623157e308 == reinterpret(Float64,max_double64) - -# Start by checking the byte-order. -ordered = 0x01234567 -@test Float32(2.9988165487136453e-38) == reinterpret(Float32,ordered) - -min_float32 = 0x00000001 -@test Float32(1.4e-45) == reinterpret(Float32,min_float32) - -max_float32 = 0x7f7fffff -@test Float32(3.4028234e38) == reinterpret(Float32,max_float32) - -ordered = 0x0123456789ABCDEF -diy_fp = Grisu.Float(reinterpret(Float64,ordered)) -@test UInt64(0x12) - UInt64(0x3FF) - 52 == diy_fp.e % UInt64 -# The 52 mantissa bits, plus the implicit 1 in bit 52 as a UINT64. -@test 0x0013456789ABCDEF== diy_fp.s - -min_double64 = 0x0000000000000001 -diy_fp = Grisu.Float(reinterpret(Float64,min_double64)) -@test -UInt64(0x3FF) - Int64(52) + Int64(1) == diy_fp.e % UInt64 -# This is a denormal so no hidden bit. -@test 1 == diy_fp.s - -max_double64 = 0x7fefffffffffffff -diy_fp = Grisu.Float(reinterpret(Float64,max_double64)) -@test 0x7FE - 0x3FF - 52 == diy_fp.e % UInt64 -@test 0x001fffffffffffff== diy_fp.s - -ordered = 0x01234567 -diy_fp = Grisu.Float(reinterpret(Float32,ordered)) -@test UInt64(0x2) - UInt64(0x7F) - 23 == diy_fp.e % UInt64 -# The 23 mantissa bits, plus the implicit 1 in bit 24 as a uint32_t. -@test 0xA34567 == UInt64(diy_fp.s) - -min_float32 = 0x00000001 -diy_fp = Grisu.Float(reinterpret(Float32,min_float32)) -@test -UInt64(0x7F) - 23 + 1 == diy_fp.e % UInt64 -# This is a denormal so no hidden bit. -@test 1 == UInt64(diy_fp.s) - -max_float32 = 0x7f7fffff -diy_fp = Grisu.Float(reinterpret(Float32,max_float32)) -@test 0xFE - 0x7F - 23 == diy_fp.e % UInt64 -@test 0x00ffffff == UInt64(diy_fp.s) - -ordered = 0x0123456789ABCDEF -diy_fp = Grisu.normalize(Grisu.Float(reinterpret(Float64,ordered))) -@test UInt64(0x12) - UInt64(0x3FF) - 52 - 11 == diy_fp.e % UInt64 -@test 0x0013456789ABCDEF<< 11 == diy_fp.s - -min_double64 = 0x0000000000000001 -diy_fp = Grisu.normalize(Grisu.Float(reinterpret(Float64,min_double64))) -@test -UInt64(0x3FF) - 52 + 1 - 63 == diy_fp.e % UInt64 -# This is a denormal so no hidden bit. -@test 0x8000000000000000== diy_fp.s - -max_double64 = 0x7fefffffffffffff -diy_fp = Grisu.normalize(Grisu.Float(reinterpret(Float64,max_double64))) -@test 0x7FE - 0x3FF - 52 - 11 == diy_fp.e % UInt64 -@test (0x001fffffffffffff<< 11) == diy_fp.s - -min_double64 = 0x0000000000000001 -@test Grisu.isdenormal(reinterpret(Float64,min_double64)) -float_bits = 0x000FFFFFFFFFFFFF -@test Grisu.isdenormal(reinterpret(Float64,float_bits)) -float_bits = 0x0010000000000000 -@test !Grisu.isdenormal(reinterpret(Float64,float_bits)) - -min_float32 = 0x00000001 -@test Grisu.isdenormal(reinterpret(Float32,min_float32)) -float_bits = 0x007FFFFF -@test Grisu.isdenormal(reinterpret(Float32,float_bits)) -float_bits = 0x00800000 -@test !Grisu.isdenormal(reinterpret(Float32,float_bits)) - -diy_fp = Grisu.normalize(Grisu.Float(1.5)) -boundary_minus, boundary_plus = Grisu.normalizedbound(1.5) -@test diy_fp.e == boundary_minus.e -@test diy_fp.e == boundary_plus.e -# 1.5 does not have a significand of the form 2^p (for some p). -# Therefore its boundaries are at the same distance. -@test diy_fp.s - boundary_minus.s == boundary_plus.s - diy_fp.s -@test (1 << 10) == diy_fp.s - boundary_minus.s - -diy_fp = Grisu.normalize(Grisu.Float(1.0)) -boundary_minus, boundary_plus = Grisu.normalizedbound(1.0) -@test diy_fp.e == boundary_minus.e -@test diy_fp.e == boundary_plus.e -# 1.0 does have a significand of the form 2^p (for some p). -# Therefore its lower boundary is twice as close as the upper boundary. -@test boundary_plus.s - diy_fp.s > diy_fp.s - boundary_minus.s -@test (1 << 9) == diy_fp.s - boundary_minus.s -@test (1 << 10) == boundary_plus.s - diy_fp.s - -min_double64 = 0x0000000000000001 -diy_fp = Grisu.normalize(Grisu.Float(reinterpret(Float64,min_double64))) -boundary_minus, boundary_plus = Grisu.normalizedbound(reinterpret(Float64,min_double64)) -@test diy_fp.e == boundary_minus.e -@test diy_fp.e == boundary_plus.e -# min-value does not have a significand of the form 2^p (for some p). -# Therefore its boundaries are at the same distance. -@test diy_fp.s - boundary_minus.s == boundary_plus.s - diy_fp.s -# Denormals have their boundaries much closer. -@test (UInt64(1) << 62) == diy_fp.s - boundary_minus.s - -smallest_normal64 = 0x0010000000000000 -diy_fp = Grisu.normalize(reinterpret(Float64,smallest_normal64)) -boundary_minus, boundary_plus = Grisu.normalizedbound(reinterpret(Float64,smallest_normal64)) -@test diy_fp.e == boundary_minus.e -@test diy_fp.e == boundary_plus.e -# Even though the significand is of the form 2^p (for some p), its boundaries -# are at the same distance. (This is the only exception). -@test diy_fp.s - boundary_minus.s == boundary_plus.s - diy_fp.s -@test (1 << 10) == diy_fp.s - boundary_minus.s - -largest_denormal64 = 0x000FFFFFFFFFFFFF -diy_fp = Grisu.normalize(reinterpret(Float64,largest_denormal64)) -boundary_minus, boundary_plus = Grisu.normalizedbound(reinterpret(Float64,largest_denormal64)) -@test diy_fp.e == boundary_minus.e -@test diy_fp.e == boundary_plus.e -@test diy_fp.s - boundary_minus.s == boundary_plus.s - diy_fp.s -@test (1 << 11) == diy_fp.s - boundary_minus.s - -max_double64 = 0x7fefffffffffffff -diy_fp = Grisu.normalize(reinterpret(Float64,max_double64)) -boundary_minus, boundary_plus = Grisu.normalizedbound(reinterpret(Float64,max_double64)) -@test diy_fp.e == boundary_minus.e -@test diy_fp.e == boundary_plus.e -# max-value does not have a significand of the form 2^p (for some p). -# Therefore its boundaries are at the same distance. -@test diy_fp.s - boundary_minus.s == boundary_plus.s - diy_fp.s -@test (1 << 10) == diy_fp.s - boundary_minus.s - -kOne64 = UInt64(1) -diy_fp = Grisu.normalize(Grisu.Float(Float32(1.5))) -boundary_minus, boundary_plus = Grisu.normalizedbound(Float32(1.5)) -@test diy_fp.e == boundary_minus.e -@test diy_fp.e == boundary_plus.e -# 1.5 does not have a significand of the form 2^p (for some p). -# Therefore its boundaries are at the same distance. -@test diy_fp.s - boundary_minus.s == boundary_plus.s - diy_fp.s -# Normalization shifts the significand by 8 bits. Add 32 bits for the bigger -# data-type, and remove 1 because boundaries are at half a ULP. -@test (kOne64 << 39) == diy_fp.s - boundary_minus.s - -diy_fp = Grisu.normalize(Grisu.Float(Float32(1.0))) -boundary_minus, boundary_plus = Grisu.normalizedbound(Float32(1.0)) -@test diy_fp.e == boundary_minus.e -@test diy_fp.e == boundary_plus.e -# 1.0 does have a significand of the form 2^p (for some p). -# Therefore its lower boundary is twice as close as the upper boundary. -@test boundary_plus.s - diy_fp.s > diy_fp.s - boundary_minus.s -@test (kOne64 << 38) == diy_fp.s - boundary_minus.s -@test (kOne64 << 39) == boundary_plus.s - diy_fp.s - -min_float32 = 0x00000001 -diy_fp = Grisu.normalize(Grisu.Float(reinterpret(Float32,min_float32))) -boundary_minus, boundary_plus = Grisu.normalizedbound(reinterpret(Float32,min_float32)) -@test diy_fp.e == boundary_minus.e -@test diy_fp.e == boundary_plus.e -# min-value does not have a significand of the form 2^p (for some p). -# Therefore its boundaries are at the same distance. -@test diy_fp.s - boundary_minus.s == boundary_plus.s - diy_fp.s -# Denormals have their boundaries much closer. -@test (kOne64 << 62) == diy_fp.s - boundary_minus.s - -smallest_normal32 = 0x00800000 -diy_fp = Grisu.normalize(Grisu.Float(reinterpret(Float32,smallest_normal32))) -boundary_minus, boundary_plus = Grisu.normalizedbound(reinterpret(Float32,smallest_normal32)) -@test diy_fp.e == boundary_minus.e -@test diy_fp.e == boundary_plus.e -# Even though the significand is of the form 2^p (for some p), its boundaries -# are at the same distance. (This is the only exception). -@test diy_fp.s - boundary_minus.s == boundary_plus.s - diy_fp.s -@test (kOne64 << 39) == diy_fp.s - boundary_minus.s - -largest_denormal32 = 0x007FFFFF -diy_fp = Grisu.normalize(Grisu.Float(reinterpret(Float32,largest_denormal32))) -boundary_minus, boundary_plus = Grisu.normalizedbound(reinterpret(Float32,largest_denormal32)) -@test diy_fp.e == boundary_minus.e -@test diy_fp.e == boundary_plus.e -@test diy_fp.s - boundary_minus.s == boundary_plus.s - diy_fp.s -@test (kOne64 << 40) == diy_fp.s - boundary_minus.s - -max_float32 = 0x7f7fffff -diy_fp = Grisu.normalize(Grisu.Float(reinterpret(Float32,max_float32))) -boundary_minus, boundary_plus = Grisu.normalizedbound(reinterpret(Float32,max_float32)) -@test diy_fp.e == boundary_minus.e -@test diy_fp.e == boundary_plus.e -# max-value does not have a significand of the form 2^p (for some p). -# Therefore its boundaries are at the same distance. -@test diy_fp.s - boundary_minus.s == boundary_plus.s - diy_fp.s -@test (kOne64 << 39) == diy_fp.s - boundary_minus.s - -#fastshortest -min_double = 5e-324 -status,len,point = Grisu.fastshortest(min_double, buffer) -@test status -@test "5" == trimrep(buffer) -@test -323 == point -fill!(buffer,0) - -max_double = 1.7976931348623157e308 -status,len,point = Grisu.fastshortest(max_double, buffer) -@test status -@test "17976931348623157" == trimrep(buffer) -@test 309 == point -fill!(buffer,0) - -status,len,point = Grisu.fastshortest(4294967272.0, buffer) -@test status -@test "4294967272" == trimrep(buffer) -@test 10 == point -fill!(buffer,0) - -status,len,point = Grisu.fastshortest(4.1855804968213567e298, buffer) -@test status -@test "4185580496821357" == trimrep(buffer) -@test 299 == point -fill!(buffer,0) - -status,len,point = Grisu.fastshortest(5.5626846462680035e-309, buffer) -@test status -@test "5562684646268003" == trimrep(buffer) -@test -308 == point -fill!(buffer,0) - -status,len,point = Grisu.fastshortest(2147483648.0, buffer) -@test status -@test "2147483648" == trimrep(buffer) -@test 10 == point -fill!(buffer,0) - -status,len,point = Grisu.fastshortest(3.5844466002796428e+298, buffer) -@test !status # Not all Grisu.fastshortest variants manage to compute this number. -if status - @test "35844466002796428" == trimrep(buffer) - @test 299 == point - fill!(buffer,0) -end - -smallest_normal64 = 0x0010000000000000 -v = reinterpret(Float64,smallest_normal64) -status,len,point = Grisu.fastshortest(v, buffer) -if status - @test "22250738585072014" == trimrep(buffer) - @test -307 == point - fill!(buffer,0) -end - -largest_denormal64 = 0x000FFFFFFFFFFFFF -v = reinterpret(Float64,largest_denormal64) -status,len,point = Grisu.fastshortest(v, buffer) -if status - @test "2225073858507201" == trimrep(buffer) - @test -307 == point - fill!(buffer,0) -end - - -min_float = Float32(1e-45) -status,len,point = Grisu.fastshortest(min_float, buffer) -@test status -@test "1" == trimrep(buffer) -@test -44 == point -fill!(buffer,0) - -max_float = 3.4028234f38 #Float32(3.4028234e38) -status,len,point = Grisu.fastshortest(max_float, buffer) -@test status -@test "34028235" == trimrep(buffer) -@test 39 == point -fill!(buffer,0) - -status,len,point = Grisu.fastshortest(Float32(4294967272.0), buffer) -@test status -@test "42949673" == trimrep(buffer) -@test 10 == point -fill!(buffer,0) - -status,len,point = Grisu.fastshortest(Float32(3.32306998946228968226e+35), buffer) -@test status -@test "332307" == trimrep(buffer) -@test 36 == point -fill!(buffer,0) - -status,len,point = Grisu.fastshortest(Float32(1.2341e-41), buffer) -@test status -@test "12341" == trimrep(buffer) -@test -40 == point -fill!(buffer,0) - -status,len,point = Grisu.fastshortest(Float32(3.3554432e7), buffer) -@test status -@test "33554432" == trimrep(buffer) -@test 8 == point -fill!(buffer,0) - -status,len,point = Grisu.fastshortest(Float32(3.26494756798464e14), buffer) -@test status -@test "32649476" == trimrep(buffer) -@test 15 == point -fill!(buffer,0) - -status,len,point = Grisu.fastshortest(Float32(3.91132223637771935344e37), buffer) -if status # Not all Grisu.fastshortest variants manage to compute this number. - @test "39113222" == trimrep(buffer) - @test 38 == point - fill!(buffer,0) -end - -smallest_normal32 = 0x00800000 -v = reinterpret(Float32,smallest_normal32) -status,len,point = Grisu.fastshortest(v, buffer) -if status - @test "11754944" == trimrep(buffer) - @test -37 == point - fill!(buffer,0) -end - -largest_denormal32 = 0x007FFFFF -v = reinterpret(Float32,largest_denormal32) -status,len,point = Grisu.fastshortest(v, buffer) -@test status -@test "11754942" == trimrep(buffer) -@test -37 == point -fill!(buffer,0) - -status,len,point = Grisu.fastprecision(1.0, 3, buffer) -@test status -@test 3 >= len-1 -@test "1" == trimrep(buffer) -@test 1 == point -fill!(buffer,0) - -status,len,point = Grisu.fastprecision(1.5, 10, buffer) -if status - @test 10 >= len-1 - @test "15" == trimrep(buffer) - @test 1 == point - fill!(buffer,0) -end - -min_double = 5e-324 -status,len,point = Grisu.fastprecision(min_double, 5,buffer) -@test status -@test "49407" == trimrep(buffer) -@test -323 == point -fill!(buffer,0) - -max_double = 1.7976931348623157e308 -status,len,point = Grisu.fastprecision(max_double, 7,buffer) -@test status -@test "1797693" == trimrep(buffer) -@test 309 == point -fill!(buffer,0) - -status,len,point = Grisu.fastprecision(4294967272.0, 14,buffer) -if status - @test 14 >= len-1 - @test "4294967272" == trimrep(buffer) - @test 10 == point - fill!(buffer,0) -end - -status,len,point = Grisu.fastprecision(4.1855804968213567e298, 17,buffer) -@test status -@test "41855804968213567" == trimrep(buffer) -@test 299 == point -fill!(buffer,0) - -status,len,point = Grisu.fastprecision(5.5626846462680035e-309, 1,buffer) -@test status -@test "6" == trimrep(buffer) -@test -308 == point -fill!(buffer,0) - -status,len,point = Grisu.fastprecision(2147483648.0, 5,buffer) -@test status -@test "21475" == trimrep(buffer) -@test 10 == point -fill!(buffer,0) - -status,len,point = Grisu.fastprecision(3.5844466002796428e+298, 10,buffer) -@test status -@test 10 >= len-1 -@test "35844466" == trimrep(buffer) -@test 299 == point -fill!(buffer,0) - -smallest_normal64 = 0x0010000000000000 -v = reinterpret(Float64,smallest_normal64) -status,len,point = Grisu.fastprecision(v, 17, buffer) -@test status -@test "22250738585072014" == trimrep(buffer) -@test -307 == point -fill!(buffer,0) - -largest_denormal64 = 0x000FFFFFFFFFFFFF -v = reinterpret(Float64,largest_denormal64) -status,len,point = Grisu.fastprecision(v, 17, buffer) -@test status -@test 20 >= len-1 -@test "22250738585072009" == trimrep(buffer) -@test -307 == point -fill!(buffer,0) - -v = 3.3161339052167390562200598e-237 -status,len,point = Grisu.fastprecision(v, 18, buffer) -@test status -@test "331613390521673906" == trimrep(buffer) -@test -236 == point -fill!(buffer,0) - -v = 7.9885183916008099497815232e+191 -status,len,point = Grisu.fastprecision(v, 4, buffer) -@test status -@test "7989" == trimrep(buffer) -@test 192 == point -fill!(buffer,0) - -#fastfixedtoa -status,len,point = Grisu.fastfixedtoa(1.0, 0,1, buffer) -@test "1" == unsafe_string(pointer(buffer)) -@test 1 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(1.0, 0,15, buffer) -@test "1" == unsafe_string(pointer(buffer)) -@test 1 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(1.0, 0,0, buffer) -@test "1" == unsafe_string(pointer(buffer)) -@test 1 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(0xFFFFFFFF, 0,5, buffer) -@test "4294967295" == unsafe_string(pointer(buffer)) -@test 10 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(4294967296.0, 0,5, buffer) -@test "4294967296" == unsafe_string(pointer(buffer)) #todo -@test 10 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(1e21, 0,5, buffer) -@test "1" == unsafe_string(pointer(buffer)) #todo extra '0's -@test 22 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(999999999999999868928.00, 0,2, buffer) -@test "999999999999999868928" == unsafe_string(pointer(buffer)) #todo extra '0' -@test 21 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(6.9999999999999989514240000e+21, 0,5, buffer) -@test "6999999999999998951424" == unsafe_string(pointer(buffer)) #todo short several '9's -@test 22 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(1.5, 0,5, buffer) -@test "15" == unsafe_string(pointer(buffer)) -@test 1 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(1.55, 0,5, buffer) -@test "155" == unsafe_string(pointer(buffer)) -@test 1 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(1.55, 0,1, buffer) -@test "16" == unsafe_string(pointer(buffer)) -@test 1 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(1.00000001, 0,15, buffer) -@test "100000001" == unsafe_string(pointer(buffer)) -@test 1 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(0.1, 0,10, buffer) -@test "1" == unsafe_string(pointer(buffer)) -@test 0 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(0.01, 0,10, buffer) -@test "1" == unsafe_string(pointer(buffer)) -@test -1 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(0.001, 0,10, buffer) -@test "1" == unsafe_string(pointer(buffer)) -@test -2 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(0.0001, 0,10, buffer) #todo -@test "1" == unsafe_string(pointer(buffer)) -@test -3 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(0.00001, 0,10, buffer) #todo -@test "1" == unsafe_string(pointer(buffer)) -@test -4 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(0.000001, 0,10, buffer) -@test "1" == unsafe_string(pointer(buffer)) -@test -5 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(0.0000001, 0,10, buffer) -@test "1" == unsafe_string(pointer(buffer)) -@test -6 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(0.00000001, 0,10, buffer) -@test "1" == unsafe_string(pointer(buffer)) -@test -7 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(0.000000001, 0,10, buffer) -@test "1" == unsafe_string(pointer(buffer)) -@test -8 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(0.0000000001, 0,15, buffer) -@test "1" == unsafe_string(pointer(buffer)) -@test -9 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(0.00000000001, 0,15, buffer) -@test "1" == unsafe_string(pointer(buffer)) -@test -10 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(0.000000000001, 0,15, buffer) -@test "1" == unsafe_string(pointer(buffer)) -@test -11 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(0.0000000000001, 0,15, buffer) -@test "1" == unsafe_string(pointer(buffer)) -@test -12 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(0.00000000000001, 0,15, buffer) -@test "1" == unsafe_string(pointer(buffer)) -@test -13 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(0.000000000000001, 0,20, buffer) -@test "1" == unsafe_string(pointer(buffer)) -@test -14 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(0.0000000000000001, 0,20, buffer) -@test "1" == unsafe_string(pointer(buffer)) -@test -15 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(0.00000000000000001, 0,20, buffer) -@test "1" == unsafe_string(pointer(buffer)) -@test -16 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(0.000000000000000001, 0,20, buffer) -@test "1" == unsafe_string(pointer(buffer)) -@test -17 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(0.0000000000000000001, 0,20, buffer) -@test "1" == unsafe_string(pointer(buffer)) -@test -18 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(0.00000000000000000001, 0,20, buffer) -@test "1" == unsafe_string(pointer(buffer)) -@test -19 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(0.10000000004, 0,10, buffer) -@test "1" == unsafe_string(pointer(buffer)) -@test 0 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(0.01000000004, 0,10, buffer) -@test "1" == unsafe_string(pointer(buffer)) -@test -1 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(0.00100000004, 0,10, buffer) -@test "1" == unsafe_string(pointer(buffer)) -@test -2 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(0.00010000004, 0,10, buffer) #todo -@test "1" == unsafe_string(pointer(buffer)) -@test -3 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(0.00001000004, 0,10, buffer) -@test "1" == unsafe_string(pointer(buffer)) -@test -4 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(0.00000100004, 0,10, buffer) -@test "1" == unsafe_string(pointer(buffer)) -@test -5 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(0.00000010004, 0,10, buffer) -@test "1" == unsafe_string(pointer(buffer)) -@test -6 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(0.00000001004, 0,10, buffer) -@test "1" == unsafe_string(pointer(buffer)) -@test -7 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(0.00000000104, 0,10, buffer) -@test "1" == unsafe_string(pointer(buffer)) -@test -8 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(0.0000000001000004, 0,15, buffer) -@test "1" == unsafe_string(pointer(buffer)) -@test -9 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(0.0000000000100004, 0,15, buffer) -@test "1" == unsafe_string(pointer(buffer)) -@test -10 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(0.0000000000010004, 0,15, buffer) -@test "1" == unsafe_string(pointer(buffer)) -@test -11 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(0.0000000000001004, 0,15, buffer) -@test "1" == unsafe_string(pointer(buffer)) -@test -12 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(0.0000000000000104, 0,15, buffer) -@test "1" == unsafe_string(pointer(buffer)) -@test -13 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(0.000000000000001000004, 0,20, buffer) -@test "1" == unsafe_string(pointer(buffer)) -@test -14 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(0.000000000000000100004, 0,20, buffer) -@test "1" == unsafe_string(pointer(buffer)) -@test -15 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(0.000000000000000010004, 0,20, buffer) -@test "1" == unsafe_string(pointer(buffer)) -@test -16 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(0.000000000000000001004, 0,20, buffer) -@test "1" == unsafe_string(pointer(buffer)) -@test -17 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(0.000000000000000000104, 0,20, buffer) -@test "1" == unsafe_string(pointer(buffer)) -@test -18 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(0.000000000000000000014, 0,20, buffer) -@test "1" == unsafe_string(pointer(buffer)) -@test -19 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(0.10000000006, 0,10, buffer) -@test "1000000001" == unsafe_string(pointer(buffer)) -@test 0 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(0.01000000006, 0,10, buffer) -@test "100000001" == unsafe_string(pointer(buffer)) -@test -1 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(0.00100000006, 0,10, buffer) -@test "10000001" == unsafe_string(pointer(buffer)) -@test -2 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(0.00010000006, 0,10, buffer) -@test "1000001" == unsafe_string(pointer(buffer)) -@test -3 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(0.00001000006, 0,10, buffer) -@test "100001" == unsafe_string(pointer(buffer)) -@test -4 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(0.00000100006, 0,10, buffer) -@test "10001" == unsafe_string(pointer(buffer)) -@test -5 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(0.00000010006, 0,10, buffer) -@test "1001" == unsafe_string(pointer(buffer)) -@test -6 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(0.00000001006, 0,10, buffer) -@test "101" == unsafe_string(pointer(buffer)) -@test -7 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(0.00000000106, 0,10, buffer) -@test "11" == unsafe_string(pointer(buffer)) -@test -8 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(0.0000000001000006, 0,15, buffer) -@test "100001" == unsafe_string(pointer(buffer)) -@test -9 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(0.0000000000100006, 0,15, buffer) -@test "10001" == unsafe_string(pointer(buffer)) -@test -10 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(0.0000000000010006, 0,15, buffer) -@test "1001" == unsafe_string(pointer(buffer)) -@test -11 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(0.0000000000001006, 0,15, buffer) -@test "101" == unsafe_string(pointer(buffer)) -@test -12 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(0.0000000000000106, 0,15, buffer) -@test "11" == unsafe_string(pointer(buffer)) -@test -13 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(0.000000000000001000006, 0,20, buffer) -@test "100001" == unsafe_string(pointer(buffer)) -@test -14 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(0.000000000000000100006, 0,20, buffer) -@test "10001" == unsafe_string(pointer(buffer)) -@test -15 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(0.000000000000000010006, 0,20, buffer) -@test "1001" == unsafe_string(pointer(buffer)) -@test -16 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(0.000000000000000001006, 0,20, buffer) -@test "101" == unsafe_string(pointer(buffer)) -@test -17 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(0.000000000000000000106, 0,20, buffer) -@test "11" == unsafe_string(pointer(buffer)) -@test -18 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(0.000000000000000000016, 0,20, buffer) -@test "2" == unsafe_string(pointer(buffer)) -@test -19 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(0.6, 0,0, buffer) -@test "1" == unsafe_string(pointer(buffer)) -@test 1 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(0.96, 0,1, buffer) -@test "1" == unsafe_string(pointer(buffer)) -@test 1 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(0.996, 0,2, buffer) -@test "1" == unsafe_string(pointer(buffer)) -@test 1 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(0.9996, 0,3, buffer) -@test "1" == unsafe_string(pointer(buffer)) -@test 1 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(0.99996, 0,4, buffer) -@test "1" == unsafe_string(pointer(buffer)) -@test 1 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(0.999996, 0,5, buffer) -@test "1" == unsafe_string(pointer(buffer)) -@test 1 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(0.9999996, 0,6, buffer) -@test "1" == unsafe_string(pointer(buffer)) -@test 1 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(0.99999996, 0,7, buffer) -@test "1" == unsafe_string(pointer(buffer)) -@test 1 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(0.999999996, 0,8, buffer) -@test "1" == unsafe_string(pointer(buffer)) -@test 1 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(0.9999999996, 0,9, buffer) -@test "1" == unsafe_string(pointer(buffer)) -@test 1 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(0.99999999996, 0,10, buffer) -@test "1" == unsafe_string(pointer(buffer)) -@test 1 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(0.999999999996, 0,11, buffer) -@test "1" == unsafe_string(pointer(buffer)) -@test 1 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(0.9999999999996, 0,12, buffer) -@test "1" == unsafe_string(pointer(buffer)) -@test 1 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(0.99999999999996, 0,13, buffer) -@test "1" == unsafe_string(pointer(buffer)) -@test 1 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(0.999999999999996, 0,14, buffer) -@test "1" == unsafe_string(pointer(buffer)) -@test 1 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(0.9999999999999996, 0,15, buffer) -@test "1" == unsafe_string(pointer(buffer)) -@test 1 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(0.00999999999999996, 0,16, buffer) -@test "1" == unsafe_string(pointer(buffer)) -@test -1 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(0.000999999999999996, 0,17, buffer) -@test "1" == unsafe_string(pointer(buffer)) -@test -2 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(0.0000999999999999996, 0,18, buffer) -@test "1" == unsafe_string(pointer(buffer)) -@test -3 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(0.00000999999999999996, 0,19, buffer) -@test "1" == unsafe_string(pointer(buffer)) -@test -4 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(0.000000999999999999996, 0,20, buffer) -@test "1" == unsafe_string(pointer(buffer)) -@test -5 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(323423.234234, 0,10, buffer) -@test "323423234234" == unsafe_string(pointer(buffer)) -@test 6 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(12345678.901234, 0,4, buffer) -@test "123456789012" == unsafe_string(pointer(buffer)) -@test 8 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(98765.432109, 0,5, buffer) -@test "9876543211" == unsafe_string(pointer(buffer)) -@test 5 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(42, 0,20, buffer) -@test "42" == unsafe_string(pointer(buffer)) -@test 2 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(0.5, 0,0, buffer) -@test "1" == unsafe_string(pointer(buffer)) -@test 1 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(1e-23, 0,10, buffer) -@test "" == unsafe_string(pointer(buffer)) -@test -10 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(1e-123, 0,2, buffer) -@test "" == unsafe_string(pointer(buffer)) -@test -2 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(1e-123, 0,0, buffer) -@test "" == unsafe_string(pointer(buffer)) -@test 0 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(1e-23, 0,20, buffer) -@test "" == unsafe_string(pointer(buffer)) -@test -20 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(1e-21, 0,20, buffer) -@test "" == unsafe_string(pointer(buffer)) -@test -20 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(1e-22, 0,20, buffer) -@test "" == unsafe_string(pointer(buffer)) -@test -20 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(6e-21, 0,20, buffer) -@test "1" == unsafe_string(pointer(buffer)) -@test -19 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(9.1193616301674545152000000e+19, 0,0,buffer) -@test "91193616301674545152" == unsafe_string(pointer(buffer)) -@test 20 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(4.8184662102767651659096515e-04, 0,19,buffer) -@test "4818466210276765" == unsafe_string(pointer(buffer)) -@test -3 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(1.9023164229540652612705182e-23, 0,8,buffer) -@test "" == unsafe_string(pointer(buffer)) -@test -8 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(1000000000000000128.0, 0,0,buffer) -@test "1000000000000000128" == unsafe_string(pointer(buffer)) -@test 19 == point -fill!(buffer,0) - -#bignumdtoa -status,len,point = Grisu.bignumdtoa(1.0, Grisu.SHORTEST, 0, buffer,bignums) -@test "1" == trimrep(buffer) -@test 1 == point -fill!(buffer,0) -map(x->Grisu.Bignums.zero!(x),bignums) - -status,len,point = Grisu.bignumdtoa(1.0, Grisu.FIXED, 3, buffer,bignums) -@test 3 >= len - 1 - point -@test "1" == trimrep(buffer) -@test 1 == point -fill!(buffer,0) -map(x->Grisu.Bignums.zero!(x),bignums) - -status,len,point = Grisu.bignumdtoa(1.0, Grisu.PRECISION, 3, buffer,bignums) -@test 3 >= len - 1 -@test "1" == trimrep(buffer) -@test 1 == point -fill!(buffer,0) -map(x->Grisu.Bignums.zero!(x),bignums) - -status,len,point = Grisu.bignumdtoa(1.5, Grisu.SHORTEST, 0, buffer,bignums) -@test "15" == trimrep(buffer) -@test 1 == point -fill!(buffer,0) -map(x->Grisu.Bignums.zero!(x),bignums) - -status,len,point = Grisu.bignumdtoa(1.5, Grisu.FIXED, 10, buffer,bignums) -@test 10 >= len - 1 - point -@test "15" == trimrep(buffer) -@test 1 == point -fill!(buffer,0) -map(x->Grisu.Bignums.zero!(x),bignums) - -status,len,point = Grisu.bignumdtoa(1.5, Grisu.PRECISION, 10, buffer,bignums) -@test 10 >= len - 1 -@test "15" == trimrep(buffer) -@test 1 == point -fill!(buffer,0) -map(x->Grisu.Bignums.zero!(x),bignums) - -min_double = 5e-324 -status,len,point = Grisu.bignumdtoa(min_double, Grisu.SHORTEST, 0, buffer,bignums) -@test "5" == trimrep(buffer) -@test -323 == point -fill!(buffer,0) -map(x->Grisu.Bignums.zero!(x),bignums) - -status,len,point = Grisu.bignumdtoa(min_double, Grisu.FIXED, 5, buffer,bignums) -@test 5 >= len - 1 - point -@test "" == trimrep(buffer) - -status,len,point = Grisu.bignumdtoa(min_double, Grisu.PRECISION, 5, buffer,bignums) -@test 5 >= len - 1 -@test "49407" == trimrep(buffer) -@test -323 == point -fill!(buffer,0) -map(x->Grisu.Bignums.zero!(x),bignums) - -max_double = 1.7976931348623157e308 -status,len,point = Grisu.bignumdtoa(max_double, Grisu.SHORTEST, 0, buffer,bignums) -@test "17976931348623157" == trimrep(buffer) -@test 309 == point -fill!(buffer,0) -map(x->Grisu.Bignums.zero!(x),bignums) - -status,len,point = Grisu.bignumdtoa(max_double, Grisu.PRECISION, 7, buffer,bignums) -@test 7 >= len - 1 -@test "1797693" == trimrep(buffer) -@test 309 == point -fill!(buffer,0) -map(x->Grisu.Bignums.zero!(x),bignums) - -status,len,point = Grisu.bignumdtoa(4294967272.0, Grisu.SHORTEST, 0, buffer,bignums) -@test "4294967272" == unsafe_string(pointer(buffer)) -@test 10 == point -fill!(buffer,0) -map(x->Grisu.Bignums.zero!(x),bignums) - -status,len,point = Grisu.bignumdtoa(4294967272.0, Grisu.FIXED, 5, buffer,bignums) -@test "429496727200000" == unsafe_string(pointer(buffer)) -@test 10 == point -fill!(buffer,0) -map(x->Grisu.Bignums.zero!(x),bignums) - -status,len,point = Grisu.bignumdtoa(4294967272.0, Grisu.PRECISION, 14, buffer,bignums) -@test 14 >= len - 1 -@test "4294967272" == trimrep(buffer) -@test 10 == point -fill!(buffer,0) -map(x->Grisu.Bignums.zero!(x),bignums) - -status,len,point = Grisu.bignumdtoa(4.1855804968213567e298, Grisu.SHORTEST, 0,buffer,bignums) -@test "4185580496821357" == trimrep(buffer) -@test 299 == point -fill!(buffer,0) -map(x->Grisu.Bignums.zero!(x),bignums) - -status,len,point = Grisu.bignumdtoa(4.1855804968213567e298, Grisu.PRECISION, 20,buffer,bignums) -@test 20 >= len - 1 -@test "41855804968213567225" == trimrep(buffer) -@test 299 == point -fill!(buffer,0) -map(x->Grisu.Bignums.zero!(x),bignums) - -status,len,point = Grisu.bignumdtoa(5.5626846462680035e-309, Grisu.SHORTEST, 0, buffer,bignums) -@test "5562684646268003" == trimrep(buffer) -@test -308 == point -fill!(buffer,0) -map(x->Grisu.Bignums.zero!(x),bignums) - -status,len,point = Grisu.bignumdtoa(5.5626846462680035e-309, Grisu.PRECISION, 1, buffer,bignums) -@test 1 >= len - 1 -@test "6" == trimrep(buffer) -@test -308 == point -fill!(buffer,0) -map(x->Grisu.Bignums.zero!(x),bignums) - -status,len,point = Grisu.bignumdtoa(2147483648.0, Grisu.SHORTEST, 0, buffer,bignums) -@test "2147483648" == trimrep(buffer) -@test 10 == point -fill!(buffer,0) -map(x->Grisu.Bignums.zero!(x),bignums) - -status,len,point = Grisu.bignumdtoa(2147483648.0, Grisu.FIXED, 2, buffer,bignums) -@test 2 >= len - 1 - point -@test "2147483648" == trimrep(buffer) -@test 10 == point -fill!(buffer,0) -map(x->Grisu.Bignums.zero!(x),bignums) - -status,len,point = Grisu.bignumdtoa(2147483648.0, Grisu.PRECISION, 5, buffer,bignums) -@test 5 >= len - 1 -@test "21475" == trimrep(buffer) -@test 10 == point -fill!(buffer,0) -map(x->Grisu.Bignums.zero!(x),bignums) - -status,len,point = Grisu.bignumdtoa(3.5844466002796428e+298, Grisu.SHORTEST, 0, buffer,bignums) -@test "35844466002796428" == trimrep(buffer) -@test 299 == point -fill!(buffer,0) -map(x->Grisu.Bignums.zero!(x),bignums) - -status,len,point = Grisu.bignumdtoa(3.5844466002796428e+298, Grisu.PRECISION, 10, buffer,bignums) -@test 10 >= len - 1 -@test "35844466" == trimrep(buffer) -@test 299 == point -fill!(buffer,0) -map(x->Grisu.Bignums.zero!(x),bignums) - -v = reinterpret(Float64,0x0010000000000000) -status,len,point = Grisu.bignumdtoa(v, Grisu.SHORTEST, 0, buffer,bignums) -@test "22250738585072014" == trimrep(buffer) -@test -307 == point -fill!(buffer,0) -map(x->Grisu.Bignums.zero!(x),bignums) - -status,len,point = Grisu.bignumdtoa(v, Grisu.PRECISION, 20, buffer,bignums) -@test 20 >= len - 1 -@test "22250738585072013831" == trimrep(buffer) -@test -307 == point -fill!(buffer,0) -map(x->Grisu.Bignums.zero!(x),bignums) - -v = reinterpret(Float64,0x000FFFFFFFFFFFFF) -status,len,point = Grisu.bignumdtoa(v, Grisu.SHORTEST, 0, buffer,bignums) -@test "2225073858507201" == trimrep(buffer) -@test -307 == point -fill!(buffer,0) -map(x->Grisu.Bignums.zero!(x),bignums) - -status,len,point = Grisu.bignumdtoa(v, Grisu.PRECISION, 20, buffer,bignums) -@test 20 >= len - 1 -@test "2225073858507200889" == trimrep(buffer) -@test -307 == point -fill!(buffer,0) -map(x->Grisu.Bignums.zero!(x),bignums) - -status,len,point = Grisu.bignumdtoa(4128420500802942e-24, Grisu.SHORTEST, 0, buffer,bignums) -@test "4128420500802942" == trimrep(buffer) -@test -8 == point -fill!(buffer,0) -map(x->Grisu.Bignums.zero!(x),bignums) - -v = 3.9292015898194142585311918e-10 -status,len,point = Grisu.bignumdtoa(v, Grisu.SHORTEST, 0, buffer,bignums) -@test "39292015898194143" == trimrep(buffer) - -v = 4194304.0 -status,len,point = Grisu.bignumdtoa(v, Grisu.FIXED, 5, buffer,bignums) -@test 5 >= len - 1 - point -@test "4194304" == trimrep(buffer) - -v = 3.3161339052167390562200598e-237 -status,len,point = Grisu.bignumdtoa(v, Grisu.PRECISION, 19, buffer,bignums) -@test 19 >= len - 1 -@test "3316133905216739056" == trimrep(buffer) -@test -236 == point -fill!(buffer,0) -map(x->Grisu.Bignums.zero!(x),bignums) - -v = 7.9885183916008099497815232e+191 -status,len,point = Grisu.bignumdtoa(v, Grisu.PRECISION, 4, buffer,bignums) -@test 4 >= len - 1 -@test "7989" == trimrep(buffer) -@test 192 == point -fill!(buffer,0) -map(x->Grisu.Bignums.zero!(x),bignums) - -v = 1.0000000000000012800000000e+17 -status,len,point = Grisu.bignumdtoa(v, Grisu.FIXED, 1, buffer,bignums) -@test 1 >= len - 1 - point -@test "100000000000000128" == trimrep(buffer) -@test 18 == point -fill!(buffer,0) -map(x->Grisu.Bignums.zero!(x),bignums) - - -min_float = Float32(1e-45) -status,len,point = Grisu.bignumdtoa(min_float, Grisu.SHORTEST, 0, buffer,bignums) -@test "1" == trimrep(buffer) -@test -44 == point -fill!(buffer,0) -map(x->Grisu.Bignums.zero!(x),bignums) - -max_float = Float32(3.4028234e38) -status,len,point = Grisu.bignumdtoa(max_float, Grisu.SHORTEST, 0, buffer,bignums) -@test "34028235" == trimrep(buffer) -@test 39 == point -fill!(buffer,0) -map(x->Grisu.Bignums.zero!(x),bignums) - -status,len,point = Grisu.bignumdtoa(Float32(4294967272.0), Grisu.SHORTEST, 0, buffer,bignums) -@test "42949673" == trimrep(buffer) -@test 10 == point -fill!(buffer,0) -map(x->Grisu.Bignums.zero!(x),bignums) - -status,len,point = Grisu.bignumdtoa(Float32(3.32306998946228968226e+35), Grisu.SHORTEST, 0, buffer,bignums) -@test "332307" == trimrep(buffer) -@test 36 == point -fill!(buffer,0) -map(x->Grisu.Bignums.zero!(x),bignums) - -status,len,point = Grisu.bignumdtoa(Float32(1.2341e-41), Grisu.SHORTEST, 0, buffer,bignums) -@test "12341" == trimrep(buffer) -@test -40 == point -fill!(buffer,0) -map(x->Grisu.Bignums.zero!(x),bignums) - -status,len,point = Grisu.bignumdtoa(Float32(3.3554432e7), Grisu.SHORTEST, 0, buffer,bignums) -@test "33554432" == trimrep(buffer) -@test 8 == point -fill!(buffer,0) -map(x->Grisu.Bignums.zero!(x),bignums) - -status,len,point = Grisu.bignumdtoa(Float32(3.26494756798464e14), Grisu.SHORTEST, 0, buffer,bignums) -@test "32649476" == trimrep(buffer) -@test 15 == point -fill!(buffer,0) -map(x->Grisu.Bignums.zero!(x),bignums) - -status,len,point = Grisu.bignumdtoa(Float32(3.91132223637771935344e37), Grisu.SHORTEST, 0, buffer,bignums) -@test "39113222" == trimrep(buffer) -@test 38 == point -fill!(buffer,0) -map(x->Grisu.Bignums.zero!(x),bignums) - -v = reinterpret(Float32,0x00800000) -status,len,point = Grisu.bignumdtoa(v, Grisu.SHORTEST, 0, buffer,bignums) -@test "11754944" == trimrep(buffer) -@test -37 == point -fill!(buffer,0) -map(x->Grisu.Bignums.zero!(x),bignums) - -v = reinterpret(Float32,0x007FFFFF) -status,len,point = Grisu.bignumdtoa(v, Grisu.SHORTEST, 0, buffer,bignums) -@test "11754942" == trimrep(buffer) -@test -37 == point -fill!(buffer,0) -map(x->Grisu.Bignums.zero!(x),bignums) - -#Float16 -min_double = floatmin(Float16) -status,len,point = Grisu.fastshortest(min_double,buffer) -@test status -@test "6104" == trimrep(buffer) -@test -4 == point -fill!(buffer,0) - -max_double = floatmax(Float16) -status,len,point = Grisu.fastshortest(max_double,buffer) -@test status -@test "655" == trimrep(buffer) -@test 5 == point -fill!(buffer,0) - -status,len,point = Grisu.fastprecision(Float16(1.0), 3, buffer) -@test status -@test 3 >= len-1 -@test "1" == trimrep(buffer) -@test 1 == point -fill!(buffer,0) - -status,len,point = Grisu.fastprecision(Float16(1.5), 10, buffer) -if status - @test 10 >= len-1 - @test "15" == trimrep(buffer) - @test 1 == point - fill!(buffer,0) -end - -status,len,point = Grisu.fastfixedtoa(Float16(1.0), 0,1, buffer) -@test "1" == unsafe_string(pointer(buffer)) -@test 1 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(Float16(1.0), 0,15, buffer) -@test "1" == unsafe_string(pointer(buffer)) -@test 1 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(Float16(1.0), 0,0, buffer) -@test "1" == unsafe_string(pointer(buffer)) -@test 1 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(Float16(1.5), 0,5, buffer) -@test "15" == unsafe_string(pointer(buffer)) -@test 1 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(Float16(1.55), 0,5, buffer) -@test "15498" == unsafe_string(pointer(buffer)) #todo -@test 1 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(Float16(1.55), 0,1, buffer) -@test "15" == unsafe_string(pointer(buffer)) -@test 1 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(Float16(1.00000001), 0,15, buffer) -@test "1" == unsafe_string(pointer(buffer)) -@test 1 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(Float16(0.1), 0,10, buffer) -@test "999755859" == unsafe_string(pointer(buffer)) -@test -1 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(Float16(0.01), 0,10, buffer) -@test "100021362" == unsafe_string(pointer(buffer)) -@test -1 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(Float16(0.001), 0,10, buffer) -@test "10004044" == unsafe_string(pointer(buffer)) -@test -2 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(Float16(0.0001), 0,10, buffer) #todo -@test "1000166" == unsafe_string(pointer(buffer)) -@test -3 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(Float16(0.00001), 0,10, buffer) #todo -@test "100136" == unsafe_string(pointer(buffer)) -@test -4 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(Float16(0.000001), 0,10, buffer) -@test "10133" == unsafe_string(pointer(buffer)) -@test -5 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(Float16(0.0000001), 0,10, buffer) -@test "1192" == unsafe_string(pointer(buffer)) -@test -6 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(Float16(0.6), 0,0, buffer) -@test "1" == unsafe_string(pointer(buffer)) -@test 1 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(Float16(0.96), 0,1, buffer) -@test "1" == unsafe_string(pointer(buffer)) -@test 1 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(Float16(0.996), 0,2, buffer) -@test "1" == unsafe_string(pointer(buffer)) -@test 1 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(Float16(0.9996), 0,3, buffer) -@test "1" == unsafe_string(pointer(buffer)) -@test 1 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(Float16(0.99996), 0,4, buffer) -@test "1" == unsafe_string(pointer(buffer)) -@test 1 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(Float16(0.999996), 0,5, buffer) -@test "1" == unsafe_string(pointer(buffer)) -@test 1 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(Float16(0.9999996), 0,6, buffer) -@test "1" == unsafe_string(pointer(buffer)) -@test 1 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(Float16(0.99999996), 0,7, buffer) -@test "1" == unsafe_string(pointer(buffer)) -@test 1 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(Float16(42), 0,20, buffer) -@test "42" == unsafe_string(pointer(buffer)) -@test 2 == point -fill!(buffer,0) - -status,len,point = Grisu.fastfixedtoa(Float16(0.5), 0,0, buffer) -@test "1" == unsafe_string(pointer(buffer)) -@test 1 == point -fill!(buffer,0) - -#dtoa -len,point,neg = Grisu.grisu(0.0, Grisu.SHORTEST, 0, buffer) -@test "0" == unsafe_string(pointer(buffer)) -@test 1 == point -fill!(buffer,0) - -len,point,neg = Grisu.grisu(Float32(0.0), Grisu.SHORTEST, 0, buffer) -@test "0" == unsafe_string(pointer(buffer)) -@test 1 == point -fill!(buffer,0) - -len,point,neg = Grisu.grisu(0.0, Grisu.FIXED, 2, buffer) -@test 1 >= len-1 -@test "0" == unsafe_string(pointer(buffer)) -@test 1 == point -fill!(buffer,0) - -len,point,neg = Grisu.grisu(0.0, Grisu.PRECISION, 3, buffer) -@test 1 >= len-1 -@test "0" == unsafe_string(pointer(buffer)) -@test 1 == point -fill!(buffer,0) - -len,point,neg = Grisu.grisu(1.0, Grisu.SHORTEST, 0, buffer) -@test "1" == unsafe_string(pointer(buffer)) -@test 1 == point -fill!(buffer,0) - -len,point,neg = Grisu.grisu(Float32(1.0), Grisu.SHORTEST, 0, buffer) -@test "1" == unsafe_string(pointer(buffer)) -@test 1 == point -fill!(buffer,0) - -len,point,neg = Grisu.grisu(1.0, Grisu.FIXED, 3, buffer) -@test 3 >= len-1-point -@test "1" == trimrep(buffer) -@test 1 == point -fill!(buffer,0) - -len,point,neg = Grisu.grisu(1.0, Grisu.PRECISION, 3, buffer) -@test 3 >= len-1 -@test "1" == trimrep(buffer) -@test 1 == point -fill!(buffer,0) - -len,point,neg = Grisu.grisu(1.5, Grisu.SHORTEST, 0, buffer) -@test "15" == unsafe_string(pointer(buffer)) -@test 1 == point -fill!(buffer,0) - -len,point,neg = Grisu.grisu(Float32(1.5), Grisu.SHORTEST, 0, buffer) -@test "15" == unsafe_string(pointer(buffer)) -@test 1 == point -fill!(buffer,0) - -len,point,neg = Grisu.grisu(1.5, Grisu.FIXED, 10, buffer) -@test 10 >= len-1-point -@test "15" == trimrep(buffer) -@test 1 == point -fill!(buffer,0) - -len,point,neg = Grisu.grisu(1.5, Grisu.PRECISION, 10, buffer) -@test 10 >= len-1 -@test "15" == trimrep(buffer) -@test 1 == point -fill!(buffer,0) - -min_double = 5e-324 -len,point,neg = Grisu.grisu(min_double, Grisu.SHORTEST, 0, buffer) -@test "5" == unsafe_string(pointer(buffer)) -@test -323 == point -fill!(buffer,0) - -min_float = 1e-45 -len,point,neg = Grisu.grisu(Float32(min_float), Grisu.SHORTEST, 0, buffer) -@test "1" == unsafe_string(pointer(buffer)) -@test -44 == point -fill!(buffer,0) - -len,point,neg = Grisu.grisu(min_double, Grisu.FIXED, 5, buffer) -@test 5 >= len-1-point -@test "" == trimrep(buffer) -@test -5 == point -fill!(buffer,0) - -len,point,neg = Grisu.grisu(min_double, Grisu.PRECISION, 5, buffer) -@test 5 >= len-1 -@test "49407" == trimrep(buffer) -@test -323 == point -fill!(buffer,0) - -max_double = 1.7976931348623157e308 -len,point,neg = Grisu.grisu(max_double, Grisu.SHORTEST, 0, buffer) -@test "17976931348623157" == unsafe_string(pointer(buffer)) -@test 309 == point -fill!(buffer,0) - -max_float = 3.4028234e38 -len,point,neg = Grisu.grisu(Float32(max_float), Grisu.SHORTEST, 0, buffer) -@test "34028235" == unsafe_string(pointer(buffer)) -@test 39 == point -fill!(buffer,0) - -len,point,neg = Grisu.grisu(max_double, Grisu.PRECISION, 7, buffer) -@test 7 >= len-1 -@test "1797693" == trimrep(buffer) -@test 309 == point -fill!(buffer,0) - -len,point,neg = Grisu.grisu(4294967272.0, Grisu.SHORTEST, 0, buffer) -@test "4294967272" == unsafe_string(pointer(buffer)) -@test 10 == point -fill!(buffer,0) - -len,point,neg = Grisu.grisu(Float32(4294967272.0), Grisu.SHORTEST, 0, buffer) -@test "42949673" == unsafe_string(pointer(buffer)) -@test 10 == point -fill!(buffer,0) - -len,point,neg = Grisu.grisu(4294967272.0, Grisu.FIXED, 5, buffer) -@test 5 >= len-1-point -@test "4294967272" == trimrep(buffer) -@test 10 == point -fill!(buffer,0) - -len,point,neg = Grisu.grisu(4294967272.0, Grisu.PRECISION, 14, buffer) -@test 14 >= len-1 -@test "4294967272" == trimrep(buffer) -@test 10 == point -fill!(buffer,0) - -len,point,neg = Grisu.grisu(4.1855804968213567e298, Grisu.SHORTEST, 0, buffer) -@test "4185580496821357" == unsafe_string(pointer(buffer)) -@test 299 == point -fill!(buffer,0) - -len,point,neg = Grisu.grisu(4.1855804968213567e298, Grisu.PRECISION, 20, buffer) -@test 20 >= len-1 -@test "41855804968213567225" == trimrep(buffer) -@test 299 == point -fill!(buffer,0) - -len,point,neg = Grisu.grisu(5.5626846462680035e-309, Grisu.SHORTEST, 0, buffer) -@test "5562684646268003" == unsafe_string(pointer(buffer)) -@test -308 == point -fill!(buffer,0) - -len,point,neg = Grisu.grisu(5.5626846462680035e-309, Grisu.PRECISION, 1, buffer) -@test 1 >= len-1 -@test "6" == trimrep(buffer) -@test -308 == point -fill!(buffer,0) - -len,point,neg = Grisu.grisu(-2147483648.0, Grisu.SHORTEST, 0, buffer) -@test 1 == neg -@test "2147483648" == unsafe_string(pointer(buffer)) -@test 10 == point -fill!(buffer,0) - -len,point,neg = Grisu.grisu(Float32(-2147483648.), Grisu.SHORTEST, 0, buffer) -@test 1 == neg -@test "21474836" == unsafe_string(pointer(buffer)) -@test 10 == point -fill!(buffer,0) - - -len,point,neg = Grisu.grisu(-2147483648.0, Grisu.FIXED, 2, buffer) -@test 2 >= len-1-point -@test "2147483648" == trimrep(buffer) -@test 10 == point -fill!(buffer,0) - -len,point,neg = Grisu.grisu(-2147483648.0, Grisu.PRECISION, 5, buffer) -@test 5 >= len-1 -@test "21475" == trimrep(buffer) -@test 10 == point -fill!(buffer,0) - -len,point,neg = Grisu.grisu(-3.5844466002796428e+298, Grisu.SHORTEST, 0, buffer) -@test 1 == neg -@test "35844466002796428" == unsafe_string(pointer(buffer)) -@test 299 == point -fill!(buffer,0) - -len,point,neg = Grisu.grisu(-3.5844466002796428e+298, Grisu.PRECISION, 10, buffer) -@test 1 == neg -@test 10 >= len-1 -@test "35844466" == trimrep(buffer) -@test 299 == point -fill!(buffer,0) - -v = reinterpret(Float64,0x0010000000000000) -len,point,neg = Grisu.grisu(v, Grisu.SHORTEST, 0, buffer) -@test "22250738585072014" == unsafe_string(pointer(buffer)) -@test -307 == point -fill!(buffer,0) - -f = reinterpret(Float32,0x00800000) -len,point,neg = Grisu.grisu(f, Grisu.SHORTEST, 0, buffer) -@test "11754944" == unsafe_string(pointer(buffer)) -@test -37 == point -fill!(buffer,0) - -len,point,neg = Grisu.grisu(v, Grisu.PRECISION, 20, buffer) -@test 20 >= len-1 -@test "22250738585072013831" == trimrep(buffer) -@test -307 == point -fill!(buffer,0) - -v = reinterpret(Float64,0x000FFFFFFFFFFFFF) -len,point,neg = Grisu.grisu(v, Grisu.SHORTEST, 0, buffer) -@test "2225073858507201" == unsafe_string(pointer(buffer)) -@test -307 == point -fill!(buffer,0) - -f = reinterpret(Float32,0x007FFFFF) -len,point,neg = Grisu.grisu(f, Grisu.SHORTEST, 0, buffer) -@test "11754942" == unsafe_string(pointer(buffer)) -@test -37 == point -fill!(buffer,0) - -len,point,neg = Grisu.grisu(v, Grisu.PRECISION, 20, buffer) -@test 20 >= len-1 -@test "2225073858507200889" == trimrep(buffer) -@test -307 == point -fill!(buffer,0) - -len,point,neg = Grisu.grisu(4128420500802942e-24, Grisu.SHORTEST, 0, buffer) -@test 0 == neg -@test "4128420500802942" == unsafe_string(pointer(buffer)) -@test -8 == point -fill!(buffer,0) - -v = -3.9292015898194142585311918e-10 -len,point,neg = Grisu.grisu(v, Grisu.SHORTEST, 0, buffer) -@test "39292015898194143" == unsafe_string(pointer(buffer)) -fill!(buffer,0) - -f = Float32(-3.9292015898194142585311918e-10) -len,point,neg = Grisu.grisu(f, Grisu.SHORTEST, 0, buffer) -@test "39292017" == unsafe_string(pointer(buffer)) -fill!(buffer,0) - -v = 4194304.0 -len,point,neg = Grisu.grisu(v, Grisu.FIXED, 5, buffer) -@test 5 >= len-1-point -@test "4194304" == trimrep(buffer) -fill!(buffer,0) - -v = 3.3161339052167390562200598e-237 -len,point,neg = Grisu.grisu(v, Grisu.PRECISION, 19, buffer) -@test 19 >= len-1 -@test "3316133905216739056" == trimrep(buffer) -@test -236 == point -fill!(buffer,0) - -len,point,neg = Grisu.grisu(0.0, Grisu.SHORTEST, 0, buffer) -@test !neg - -len,point,neg = Grisu.grisu(-0.0, Grisu.SHORTEST, 0, buffer) -@test neg - -len,point,neg = Grisu.grisu(1.0, Grisu.SHORTEST, 0, buffer) -@test !neg - -len,point,neg = Grisu.grisu(-1.0, Grisu.SHORTEST, 0, buffer) -@test neg - -len,point,neg = Grisu.grisu(Float32(0.0), Grisu.SHORTEST, 0, buffer) -@test !neg - -len,point,neg = Grisu.grisu(-Float32(0.0), Grisu.SHORTEST, 0, buffer) -@test neg - -len,point,neg = Grisu.grisu(Float32(1.0), Grisu.SHORTEST, 0, buffer) -@test !neg - -len,point,neg = Grisu.grisu(-Float32(1.0), Grisu.SHORTEST, 0, buffer) -@test neg - -len,point,neg = Grisu.grisu(0.0, Grisu.PRECISION, 1, buffer) -@test !neg - -len,point,neg = Grisu.grisu(-0.0, Grisu.PRECISION, 1, buffer) -@test neg - -len,point,neg = Grisu.grisu(1.0, Grisu.PRECISION, 1, buffer) -@test !neg - -len,point,neg = Grisu.grisu(-1.0, Grisu.PRECISION, 1, buffer) -@test neg - -len,point,neg = Grisu.grisu(0.0, Grisu.FIXED, 1, buffer) -@test !neg - -len,point,neg = Grisu.grisu(-0.0, Grisu.FIXED, 1, buffer) -@test neg - -len,point,neg = Grisu.grisu(1.0, Grisu.FIXED, 1, buffer) -@test !neg - -len,point,neg = Grisu.grisu(-1.0, Grisu.FIXED, 1, buffer) -@test neg - - -len,point,neg = Grisu.grisu(0.0, Grisu.PRECISION, 0, buffer) -@test 0 >= len-1 -@test "" == unsafe_string(pointer(buffer)) -@test !neg - -len,point,neg = Grisu.grisu(1.0, Grisu.PRECISION, 0, buffer) -@test 0 >= len-1 -@test "" == unsafe_string(pointer(buffer)) -@test !neg - -len,point,neg = Grisu.grisu(0.0, Grisu.FIXED, 0, buffer) -@test 1 >= len-1 -@test "0" == unsafe_string(pointer(buffer)) -@test !neg - -len,point,neg = Grisu.grisu(1.0, Grisu.FIXED, 0, buffer) -@test 1 >= len-1 -@test "1" == unsafe_string(pointer(buffer)) -@test !neg - -# issue #29885 -@sync let p = Pipe(), q = Pipe() - Base.link_pipe!(p, reader_supports_async=true, writer_supports_async=true) - Base.link_pipe!(q, reader_supports_async=true, writer_supports_async=true) - @async write(p, zeros(UInt8, 2^18)) - @async (print(p, 12.345); close(p.in)) - @async print(q, 9.8) - read(p, 2^18) - @test read(p, String) == "12.345" -end