diff mbox

use "%Le" to display floats

Message ID 20180625190525.89771-1-luc.vanoostenryck@gmail.com (mailing list archive)
State Mainlined, archived
Headers show

Commit Message

Luc Van Oostenryck June 25, 2018, 7:05 p.m. UTC
Floating-point values are displayed using the printf
format "%Lf" but this is the format without exponent
(and with default precision of 6 digit).

However, by its nature, this format is very imprecise.
For example, *all* values smaller than 0.5e-6 are displayed
as "0.000000".

Improve this by using the "%Le" format which always use
an exponent and thus maximize the precision.

Note: ultimately, we should display them exactly, for
      example by using "%La", but this will requires C99.

Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
---
 linearize.c                                |  4 ++--
 show-parse.c                               |  2 +-
 validation/fp-ops.c                        |  2 +-
 validation/linear/cast-constant-to-float.c |  6 +++---
 validation/linear/cast-constants.c         | 20 ++++++++++----------
 validation/optim/bool-context-fp.c         |  8 ++++----
 6 files changed, 21 insertions(+), 21 deletions(-)

Comments

Ramsay Jones June 25, 2018, 9:10 p.m. UTC | #1
On 25/06/18 20:05, Luc Van Oostenryck wrote:
> Floating-point values are displayed using the printf
> format "%Lf" but this is the format without exponent
> (and with default precision of 6 digit).
> 
> However, by its nature, this format is very imprecise.
> For example, *all* values smaller than 0.5e-6 are displayed
> as "0.000000".
> 
> Improve this by using the "%Le" format which always use
> an exponent and thus maximize the precision.

Did you consider the "%Lg" format?

ATB,
Ramsay Jones

--
To unsubscribe from this list: send the line "unsubscribe linux-sparse" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Luc Van Oostenryck June 25, 2018, 9:28 p.m. UTC | #2
On Mon, Jun 25, 2018 at 10:10:16PM +0100, Ramsay Jones wrote:
> 
> 
> On 25/06/18 20:05, Luc Van Oostenryck wrote:
> > Floating-point values are displayed using the printf
> > format "%Lf" but this is the format without exponent
> > (and with default precision of 6 digit).
> > 
> > However, by its nature, this format is very imprecise.
> > For example, *all* values smaller than 0.5e-6 are displayed
> > as "0.000000".
> > 
> > Improve this by using the "%Le" format which always use
> > an exponent and thus maximize the precision.
> 
> Did you consider the "%Lg" format?

Yes, I tried it before %Le because it's the 'g' format I was
used to when I had to display some floating-point value but
here I prefer the 'e' format in order to have the exact same
'd.dddddde±dd' for all values. In particular I like to always
have a decimal point present (not that it matters much, though).

-- Luc
--
To unsubscribe from this list: send the line "unsubscribe linux-sparse" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/linearize.c b/linearize.c
index d1a079f4e..cde842866 100644
--- a/linearize.c
+++ b/linearize.c
@@ -369,7 +369,7 @@  const char *show_instruction(struct instruction *insn)
 			buf += sprintf(buf, "%lld", expr->value);
 			break;
 		case EXPR_FVALUE:
-			buf += sprintf(buf, "%Lf", expr->fvalue);
+			buf += sprintf(buf, "%Le", expr->fvalue);
 			break;
 		case EXPR_STRING:
 			buf += sprintf(buf, "%.40s", show_string(expr->string));
@@ -387,7 +387,7 @@  const char *show_instruction(struct instruction *insn)
 	}
 	case OP_SETFVAL:
 		buf += sprintf(buf, "%s <- ", show_pseudo(insn->target));
-		buf += sprintf(buf, "%Lf", insn->fvalue);
+		buf += sprintf(buf, "%Le", insn->fvalue);
 		break;
 
 	case OP_SWITCH: {
diff --git a/show-parse.c b/show-parse.c
index 72d3f3854..6328439c9 100644
--- a/show-parse.c
+++ b/show-parse.c
@@ -987,7 +987,7 @@  static int show_fvalue(struct expression *expr)
 	int new = new_pseudo();
 	long double value = expr->fvalue;
 
-	printf("\tmovf.%d\t\tv%d,$%Lf\n", expr->ctype->bit_size, new, value);
+	printf("\tmovf.%d\t\tv%d,$%Le\n", expr->ctype->bit_size, new, value);
 	return new;
 }
 
diff --git a/validation/fp-ops.c b/validation/fp-ops.c
index 81f73384e..96c246f84 100644
--- a/validation/fp-ops.c
+++ b/validation/fp-ops.c
@@ -48,7 +48,7 @@  fneg:
 ftst:
 .L10:
 	<entry-point>
-	setfval.64  %r21 <- 0.000000
+	setfval.64  %r21 <- 0.000000e+00
 	fcmpoeq.1   %r23 <- %arg1, %r21
 	ret.1       %r23
 
diff --git a/validation/linear/cast-constant-to-float.c b/validation/linear/cast-constant-to-float.c
index ef7892f17..ac4eff0f1 100644
--- a/validation/linear/cast-constant-to-float.c
+++ b/validation/linear/cast-constant-to-float.c
@@ -13,21 +13,21 @@  double f3(void) { return -1.0; }
 f1:
 .L0:
 	<entry-point>
-	setfval.64  %r1 <- -1.000000
+	setfval.64  %r1 <- -1.000000e+00
 	ret.64      %r1
 
 
 f2:
 .L2:
 	<entry-point>
-	setfval.64  %r3 <- -1.000000
+	setfval.64  %r3 <- -1.000000e+00
 	ret.64      %r3
 
 
 f3:
 .L4:
 	<entry-point>
-	setfval.64  %r5 <- -1.000000
+	setfval.64  %r5 <- -1.000000e+00
 	ret.64      %r5
 
 
diff --git a/validation/linear/cast-constants.c b/validation/linear/cast-constants.c
index 9e2006724..c1fdab41e 100644
--- a/validation/linear/cast-constants.c
+++ b/validation/linear/cast-constants.c
@@ -286,70 +286,70 @@  vptr_2_iptr:
 int_2_float:
 .L76:
 	<entry-point>
-	setfval.32  %r39 <- 123.000000
+	setfval.32  %r39 <- 1.230000e+02
 	ret.32      %r39
 
 
 uint_2_float:
 .L78:
 	<entry-point>
-	setfval.32  %r41 <- 123.000000
+	setfval.32  %r41 <- 1.230000e+02
 	ret.32      %r41
 
 
 long_2_float:
 .L80:
 	<entry-point>
-	setfval.32  %r43 <- 123.000000
+	setfval.32  %r43 <- 1.230000e+02
 	ret.32      %r43
 
 
 ulong_2_float:
 .L82:
 	<entry-point>
-	setfval.32  %r45 <- 123.000000
+	setfval.32  %r45 <- 1.230000e+02
 	ret.32      %r45
 
 
 double_2_float:
 .L84:
 	<entry-point>
-	setfval.32  %r47 <- 1.123000
+	setfval.32  %r47 <- 1.123000e+00
 	ret.32      %r47
 
 
 int_2_double:
 .L86:
 	<entry-point>
-	setfval.64  %r49 <- 123.000000
+	setfval.64  %r49 <- 1.230000e+02
 	ret.64      %r49
 
 
 uint_2_double:
 .L88:
 	<entry-point>
-	setfval.64  %r51 <- 123.000000
+	setfval.64  %r51 <- 1.230000e+02
 	ret.64      %r51
 
 
 long_2_double:
 .L90:
 	<entry-point>
-	setfval.64  %r53 <- 123.000000
+	setfval.64  %r53 <- 1.230000e+02
 	ret.64      %r53
 
 
 ulong_2_double:
 .L92:
 	<entry-point>
-	setfval.64  %r55 <- 123.000000
+	setfval.64  %r55 <- 1.230000e+02
 	ret.64      %r55
 
 
 float_2_double:
 .L94:
 	<entry-point>
-	setfval.64  %r57 <- 1.123000
+	setfval.64  %r57 <- 1.123000e+00
 	ret.64      %r57
 
 
diff --git a/validation/optim/bool-context-fp.c b/validation/optim/bool-context-fp.c
index ad075c56e..1d3aefa96 100644
--- a/validation/optim/bool-context-fp.c
+++ b/validation/optim/bool-context-fp.c
@@ -14,7 +14,7 @@  int  ifnot(float a) { return !a; }
 bfimp:
 .L0:
 	<entry-point>
-	setfval.32  %r2 <- 0.000000
+	setfval.32  %r2 <- 0.000000e+00
 	fcmpune.1   %r3 <- %arg1, %r2
 	ret.1       %r3
 
@@ -22,7 +22,7 @@  bfimp:
 bfexp:
 .L2:
 	<entry-point>
-	setfval.32  %r6 <- 0.000000
+	setfval.32  %r6 <- 0.000000e+00
 	fcmpune.1   %r7 <- %arg1, %r6
 	ret.1       %r7
 
@@ -30,7 +30,7 @@  bfexp:
 bfnot:
 .L4:
 	<entry-point>
-	setfval.32  %r10 <- 0.000000
+	setfval.32  %r10 <- 0.000000e+00
 	fcmpoeq.1   %r12 <- %arg1, %r10
 	ret.1       %r12
 
@@ -38,7 +38,7 @@  bfnot:
 ifnot:
 .L6:
 	<entry-point>
-	setfval.32  %r15 <- 0.000000
+	setfval.32  %r15 <- 0.000000e+00
 	fcmpoeq.32  %r16 <- %arg1, %r15
 	ret.32      %r16