|
20 | 20 |
|
21 | 21 |
|
22 | 22 | #import Formatting
|
23 |
| -import Printf.@printf |
| 23 | +import Printf.@sprintf |
24 | 24 | import Base.convert, Base.show, Base.Float16, Base.Float32, Base.Float64
|
25 | 25 | import Base.sign, Base.signbit, Base.bitstring
|
26 | 26 | import Base.typemin, Base.typemax, Base.maxintfloat, Base.ldexp, Base.eps
|
@@ -326,7 +326,7 @@ julia> eps(Floatmu{2, 2})
|
326 | 326 | 0.25
|
327 | 327 |
|
328 | 328 | julia> eps(Floatmu{3, 5})
|
329 |
| -0.0312 |
| 329 | +0.031 |
330 | 330 |
|
331 | 331 | julia> eps(Floatmu{8, 23})==eps(Float32)
|
332 | 332 | true
|
@@ -818,13 +818,13 @@ julia> convert(Float32,Floatmu{5, 10}(0.1)) == Float16(0.1)
|
818 | 818 | true
|
819 | 819 |
|
820 | 820 | julia> convert(Floatmu{2, 4},0.1)
|
821 |
| -0.125 |
| 821 | +0.12 |
822 | 822 |
|
823 | 823 | julia> convert(Floatmu{2, 4},0.1f0)
|
824 |
| -0.125 |
| 824 | +0.12 |
825 | 825 |
|
826 | 826 | julia> convert(Floatmu{2, 4},Float16(0.1))
|
827 |
| -0.125 |
| 827 | +0.12 |
828 | 828 |
|
829 | 829 | julia> Floatmu{5, 10}(0.1)==Float16(0.1)
|
830 | 830 | true
|
@@ -978,35 +978,37 @@ function tryparse(::Type{Floatmu{szE,szf}}, str::AbstractString) where {szE, szf
|
978 | 978 | end
|
979 | 979 |
|
980 | 980 |
|
981 |
| -# Hack to use @printf with a format depending on the `Floatmu` used. |
982 |
| -# Since @printf is a macro, it cannot be called with anything other than a constant |
983 |
| -# for the format string. |
984 |
| -# The number of digits used to display a value is chosen so as to ensure |
985 |
| -# a correct round-trip (``In-and-out conversions'', David Matula, |
986 |
| -# Comm. ACM, 11(1), Jan. 1968) |
987 |
| -variable_printf(io,x::Floatmu{szE,2}) where {szE} = @printf(io,"%.2g",convert(Float64,x)) |
988 |
| -variable_printf(io,x::Floatmu{szE,3}) where {szE} = @printf(io,"%.3g",convert(Float64,x)) |
989 |
| -variable_printf(io,x::Floatmu{szE,4}) where {szE} = @printf(io,"%.3g",convert(Float64,x)) |
990 |
| -variable_printf(io,x::Floatmu{szE,5}) where {szE} = @printf(io,"%.3g",convert(Float64,x)) |
991 |
| -variable_printf(io,x::Floatmu{szE,6}) where {szE} = @printf(io,"%.4g",convert(Float64,x)) |
992 |
| -variable_printf(io,x::Floatmu{szE,7}) where {szE} = @printf(io,"%.4g",convert(Float64,x)) |
993 |
| -variable_printf(io,x::Floatmu{szE,8}) where {szE} = @printf(io,"%.4g",convert(Float64,x)) |
994 |
| -variable_printf(io,x::Floatmu{szE,9}) where {szE} = @printf(io,"%.5g",convert(Float64,x)) |
995 |
| -variable_printf(io,x::Floatmu{szE,10}) where {szE} = @printf(io,"%.5g",convert(Float64,x)) |
996 |
| -variable_printf(io,x::Floatmu{szE,11}) where {szE} = @printf(io,"%.5g",convert(Float64,x)) |
997 |
| -variable_printf(io,x::Floatmu{szE,12}) where {szE} = @printf(io,"%.5g",convert(Float64,x)) |
998 |
| -variable_printf(io,x::Floatmu{szE,13}) where {szE} = @printf(io,"%.6g",convert(Float64,x)) |
999 |
| -variable_printf(io,x::Floatmu{szE,14}) where {szE} = @printf(io,"%.6g",convert(Float64,x)) |
1000 |
| -variable_printf(io,x::Floatmu{szE,15}) where {szE} = @printf(io,"%.6g",convert(Float64,x)) |
1001 |
| -variable_printf(io,x::Floatmu{szE,16}) where {szE} = @printf(io,"%.7g",convert(Float64,x)) |
1002 |
| -variable_printf(io,x::Floatmu{szE,17}) where {szE} = @printf(io,"%.7g",convert(Float64,x)) |
1003 |
| -variable_printf(io,x::Floatmu{szE,18}) where {szE} = @printf(io,"%.7g",convert(Float64,x)) |
1004 |
| -variable_printf(io,x::Floatmu{szE,19}) where {szE} = @printf(io,"%.8g",convert(Float64,x)) |
1005 |
| -variable_printf(io,x::Floatmu{szE,20}) where {szE} = @printf(io,"%.8g",convert(Float64,x)) |
1006 |
| -variable_printf(io,x::Floatmu{szE,21}) where {szE} = @printf(io,"%.8g",convert(Float64,x)) |
1007 |
| -variable_printf(io,x::Floatmu{szE,22}) where {szE} = @printf(io,"%.8g",convert(Float64,x)) |
1008 |
| -variable_printf(io,x::Floatmu{szE,23}) where {szE} = @printf(io,"%.9g",convert(Float64,x)) |
| 981 | +# Hack to use @sprintf with a format depending on the `Floatmu` used. |
| 982 | +# Since @sprintf is a macro, it cannot be called with anything other |
| 983 | +# than a constant for the format string. |
| 984 | +sprintf1(v) = @sprintf("%.1g",v) |
| 985 | +sprintf2(v) = @sprintf("%.2g",v) |
| 986 | +sprintf3(v) = @sprintf("%.3g",v) |
| 987 | +sprintf4(v) = @sprintf("%.4g",v) |
| 988 | +sprintf5(v) = @sprintf("%.5g",v) |
| 989 | +sprintf6(v) = @sprintf("%.6g",v) |
| 990 | +sprintf7(v) = @sprintf("%.7g",v) |
| 991 | +sprintf8(v) = @sprintf("%.8g",v) |
| 992 | +sprintf9(v) = @sprintf("%.9g",v) |
| 993 | +function sprintf(sz) |
| 994 | + return @eval ($(Symbol("sprintf$sz"))) |
| 995 | +end |
1009 | 996 |
|
| 997 | +# Computing the shortest decimal string that round-trips. |
| 998 | +function variable_printf(io, x) |
| 999 | + s = @sprintf("%.9g",x) # Using the largest precision possibly required |
| 1000 | + sz = 9 |
| 1001 | + tx = typeof(x) |
| 1002 | + while true |
| 1003 | + s2 = sprintf(sz)(x) |
| 1004 | + if parse(tx,s2) != x || sz == 1 |
| 1005 | + print(io,s) |
| 1006 | + return |
| 1007 | + end |
| 1008 | + s = s2 |
| 1009 | + sz = sz - 1 |
| 1010 | + end |
| 1011 | +end |
1010 | 1012 |
|
1011 | 1013 | function show(io::IO, x::Floatmu{szE,szf}) where {szE, szf}
|
1012 | 1014 | if isnan(x)
|
@@ -1329,7 +1331,7 @@ part of the resulting range:
|
1329 | 1331 | julia> collect(FloatmuIterator(Floatmu{2,2},-Inf,Inf,5))
|
1330 | 1332 | 6-element Vector{Floatmu{2, 2}}:
|
1331 | 1333 | -Infμ{2, 2}
|
1332 |
| - -1.75 |
| 1334 | + -1.8 |
1333 | 1335 | -0.5
|
1334 | 1336 | 0.75
|
1335 | 1337 | 2.0
|
|
0 commit comments