Merge pull request #2836 from triska/format_floats
Correct handling of floats in format/2 and portray_clause/1
This commit is contained in:
@@ -285,36 +285,12 @@ cells([~|Fs0], Args0, Tab, Es, VNs) -->
|
|||||||
cells(Fs, Args, 0, [], VNs).
|
cells(Fs, Args, 0, [], VNs).
|
||||||
cells([~,s|Fs], [Arg|Args], Tab, Es, VNs) --> !,
|
cells([~,s|Fs], [Arg|Args], Tab, Es, VNs) --> !,
|
||||||
cells(Fs, Args, Tab, [chars(Arg)|Es], VNs).
|
cells(Fs, Args, Tab, [chars(Arg)|Es], VNs).
|
||||||
cells([~,f|Fs], [Arg|Args], Tab, Es, VNs) --> !,
|
cells([~,f|Fs], Args, Tab, Es, VNs) --> !,
|
||||||
{ G = format_number_chars(Arg, Chars) },
|
cells([~,'6',f|Fs], Args, Tab, Es, VNs).
|
||||||
cells(Fs, Args, Tab, [chars(Chars),goal(G)|Es], VNs).
|
|
||||||
cells([~|Fs0], Args0, Tab, Es, VNs) -->
|
cells([~|Fs0], Args0, Tab, Es, VNs) -->
|
||||||
{ numeric_argument(Fs0, Num, [f|Fs], Args0, [Arg|Args]) },
|
{ numeric_argument(Fs0, Num, [f|Fs], Args0, [Arg|Args]) },
|
||||||
!,
|
!,
|
||||||
{ G = (format_number_chars(Arg, Cs0),
|
{ G = phrase(float_with_n_decimal_digits(Arg, Num), Chars) },
|
||||||
phrase(upto_what(Bs, .), Cs0, Cs),
|
|
||||||
( Num =:= 0 -> Chars = Bs
|
|
||||||
; ( Cs = ['.'|Rest] ->
|
|
||||||
length(Rest, L),
|
|
||||||
( Num < L ->
|
|
||||||
length(Ds, Num),
|
|
||||||
append(Ds, _, Rest)
|
|
||||||
; Num =:= L ->
|
|
||||||
Ds = Rest
|
|
||||||
; Num > L,
|
|
||||||
Delta is Num - L,
|
|
||||||
% we should look into the float with
|
|
||||||
% greater accuracy here, and use the
|
|
||||||
% actual digits instead of 0.
|
|
||||||
length(Zs, Delta),
|
|
||||||
maplist(=('0'), Zs),
|
|
||||||
append(Rest, Zs, Ds)
|
|
||||||
)
|
|
||||||
; length(Ds, Num),
|
|
||||||
maplist(=('0'), Ds)
|
|
||||||
),
|
|
||||||
append(Bs, ['.'|Ds], Chars)
|
|
||||||
)) },
|
|
||||||
cells(Fs, Args, Tab, [chars(Chars),goal(G)|Es], VNs).
|
cells(Fs, Args, Tab, [chars(Chars),goal(G)|Es], VNs).
|
||||||
cells([~,r|Fs], Args, Tab, Es, VNs) --> !,
|
cells([~,r|Fs], Args, Tab, Es, VNs) --> !,
|
||||||
cells([~,'8',r|Fs], Args, Tab, Es, VNs).
|
cells([~,'8',r|Fs], Args, Tab, Es, VNs).
|
||||||
@@ -369,9 +345,18 @@ cells(Fs0, Args, Tab, Es, VNs) -->
|
|||||||
Fs1 = [_|_] },
|
Fs1 = [_|_] },
|
||||||
cells(Fs, Args, Tab, [chars(Fs1)|Es], VNs).
|
cells(Fs, Args, Tab, [chars(Fs1)|Es], VNs).
|
||||||
|
|
||||||
format_number_chars(N0, Chars) :-
|
float_with_n_decimal_digits(F, N) -->
|
||||||
N is N0, % evaluate compound expression
|
{ Fr is abs(float_fractional_part(F)),
|
||||||
number_chars(N, Chars).
|
FrR0 is round(Fr*10^N),
|
||||||
|
I0 is truncate(F),
|
||||||
|
( FrR0 >= 10^N
|
||||||
|
-> I is I0+truncate(sign(F)), FrR = FrR0
|
||||||
|
; I = I0, FrR is FrR0+10^N
|
||||||
|
)
|
||||||
|
},
|
||||||
|
( { I=0, F<0, FrR>10^N } -> "-0" ; { number_chars(I, Is) }, seq(Is) ),
|
||||||
|
".",
|
||||||
|
( { FrR = 1 } -> "0" ; { number_chars(FrR, ['1'|FrRs]) }, seq(FrRs) ).
|
||||||
|
|
||||||
n_newlines(N0) --> { N0 > 0, N is N0 - 1 }, [newline], n_newlines(N).
|
n_newlines(N0) --> { N0 > 0, N is N0 - 1 }, [newline], n_newlines(N).
|
||||||
n_newlines(0) --> [].
|
n_newlines(0) --> [].
|
||||||
@@ -595,6 +580,7 @@ portray_clause_(Term) -->
|
|||||||
literal(Lit, VNs) -->
|
literal(Lit, VNs) -->
|
||||||
{ write_term_to_chars(Lit, [quoted(true),variable_names(VNs),double_quotes(true)], Ls) },
|
{ write_term_to_chars(Lit, [quoted(true),variable_names(VNs),double_quotes(true)], Ls) },
|
||||||
( { nonvar(Lit),
|
( { nonvar(Lit),
|
||||||
|
\+ number(Lit),
|
||||||
functor(Lit, F, A),
|
functor(Lit, F, A),
|
||||||
current_op(Pri, _, F),
|
current_op(Pri, _, F),
|
||||||
( A =:= 0
|
( A =:= 0
|
||||||
|
|||||||
Reference in New Issue
Block a user