[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PULL 11/33] string-output-visitor: Fix to use sufficient precision
From: |
Markus Armbruster |
Subject: |
[PULL 11/33] string-output-visitor: Fix to use sufficient precision |
Date: |
Sat, 19 Dec 2020 11:55:10 +0100 |
The string output visitor should serialize numbers so that the string
input visitor deserializes them back to the same number. It fails to
do so.
print_type_number() uses format %f. This is prone to nasty rounding
errors. For instance, numbers between 0 and 0.0000005 get flushed to
zero.
We currently use this visitor only for HMP info migrate, info network,
info qtree, and info memdev. No double values occur there as far as I
can tell.
Fix anyway by formatting with %.17g. 17 decimal digits always suffice
for IEEE double.
See also recent commit "qobject: Fix qnum_to_string() to use
sufficient precision".
Signed-off-by: Markus Armbruster <armbru@redhat.com>
Message-Id: <20201210161452.2813491-9-armbru@redhat.com>
---
qapi/string-output-visitor.c | 2 +-
tests/test-string-output-visitor.c | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/qapi/string-output-visitor.c b/qapi/string-output-visitor.c
index b74aa4d44c..5506c933de 100644
--- a/qapi/string-output-visitor.c
+++ b/qapi/string-output-visitor.c
@@ -258,7 +258,7 @@ static bool print_type_number(Visitor *v, const char *name,
double *obj,
Error **errp)
{
StringOutputVisitor *sov = to_sov(v);
- string_output_set(sov, g_strdup_printf("%f", *obj));
+ string_output_set(sov, g_strdup_printf("%.17g", *obj));
return true;
}
diff --git a/tests/test-string-output-visitor.c
b/tests/test-string-output-visitor.c
index cec20848ea..0dae04b960 100644
--- a/tests/test-string-output-visitor.c
+++ b/tests/test-string-output-visitor.c
@@ -136,7 +136,7 @@ static void test_visitor_out_number(TestOutputVisitorData
*data,
visit_type_number(data->ov, NULL, &value, &error_abort);
str = visitor_get(data);
- g_assert_cmpstr(str, ==, "3.141593");
+ g_assert_cmpstr(str, ==, "3.1415926535897931");
}
static void test_visitor_out_string(TestOutputVisitorData *data,
--
2.26.2
- [PULL 00/33] QAPI patches patches for 2020-12-19, Markus Armbruster, 2020/12/19
- [PULL 04/33] tests/check-qjson: Don't skip funny QNumber to JSON conversions, Markus Armbruster, 2020/12/19
- [PULL 01/33] rocker: Revamp fp_port_get_info, Markus Armbruster, 2020/12/19
- [PULL 11/33] string-output-visitor: Fix to use sufficient precision,
Markus Armbruster <=
- [PULL 05/33] tests/check-qjson: Examine QNum more thoroughly, Markus Armbruster, 2020/12/19
- [PULL 09/33] qobject: Fix qnum_to_string() to use sufficient precision, Markus Armbruster, 2020/12/19
- [PULL 06/33] tests/check-qjson: Cover number 2^63, Markus Armbruster, 2020/12/19
- [PULL 10/33] test-string-output-visitor: Cover "unround" number, Markus Armbruster, 2020/12/19
- [PULL 08/33] tests/check-qnum: Cover qnum_to_string() for "unround" argument, Markus Armbruster, 2020/12/19
- [PULL 12/33] test-visitor-serialization: Drop insufficient precision workaround, Markus Armbruster, 2020/12/19
- [PULL 07/33] tests/check-qjson: Replace redundant large_number(), Markus Armbruster, 2020/12/19
- [PULL 02/33] migration: Refactor migrate_cap_add, Markus Armbruster, 2020/12/19
- [PULL 26/33] qobject: Drop qstring_get_try_str(), Markus Armbruster, 2020/12/19
- [PULL 13/33] test-visitor-serialization: Clean up test_primitives(), Markus Armbruster, 2020/12/19