Skip to content

Commit 2cda582

Browse files
committed
Workaround broken signif call
1 parent 71525f1 commit 2cda582

File tree

1 file changed

+31
-2
lines changed

1 file changed

+31
-2
lines changed

src/fmtcore.jl

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,36 @@ function _pfmt_floate(out::IO, sch::Char, zs::Integer, u::Real, prec::Int, e::In
219219
end
220220

221221

222+
# Pull in definition of signif from v0.6.2 base, since it is currently broken for
223+
# BigFloat and DecFP (at least) on master
224+
225+
@static if VERSION >= v"0.7.0-DEV.4804"
226+
# adapted from Matlab File Exchange roundsd: http://www.mathworks.com/matlabcentral/fileexchange/26212
227+
# for round, og is the power of 10 relative to the decimal point
228+
# for signif, og is the absolute power of 10
229+
# digits and base must be integers, x must be convertable to float
230+
231+
function signif(x::Real, digits::Integer, base::Integer=10)
232+
digits < 1 && throw(DomainError())
233+
234+
x = float(x)
235+
(x == 0 || !isfinite(x)) && return x
236+
if base == 10
237+
e = floor(log10(abs(x)) - digits + 1.)
238+
og = oftype(x, exp10(abs(e)))
239+
elseif base == 2
240+
e = exponent(abs(x)) - digits + 1.
241+
og = oftype(x, exp2(abs(e)))
242+
else
243+
e = floor(log(base, abs(x)) - digits + 1.)
244+
og = oftype(x, float(base) ^ abs(e))
245+
end
246+
# for numeric stability
247+
r = e >= 0 ? round(x/og)*og : round(x*og)/og
248+
isfinite(r) ? r : x
249+
end
250+
end
251+
222252
function _pfmt_e(out::IO, fs::FormatSpec, x::AbstractFloat)
223253
# extract sign, significand, and exponent
224254
ax = abs(x)
@@ -227,8 +257,7 @@ function _pfmt_e(out::IO, fs::FormatSpec, x::AbstractFloat)
227257
e = 0
228258
u = zero(x)
229259
else
230-
rax = (@static VERSION < v"0.7.0-DEV.4804" ? signif(ax, fs.prec + 1) :
231-
round(ax; sigdigits = fs.prec + 1))
260+
rax = signif(ax, fs.prec + 1) # round(ax; sigdigits = fs.prec + 1)
232261
e = floor(Integer, log10(rax)) # exponent
233262
u = rax * exp10(-e) # significand
234263
end

0 commit comments

Comments
 (0)