diff --git a/sexp.c b/sexp.c index c2ce49c4..10e45376 100644 --- a/sexp.c +++ b/sexp.c @@ -1913,9 +1913,12 @@ sexp sexp_write_one (sexp ctx, sexp obj, sexp out) { } else #endif { - i = snprintf(numbuf, NUMBUF_LEN, "%.16lg", f); - if (i >= 16 && sscanf(numbuf, "%lg", &ftmp) == 1 && ftmp != f) { - i = snprintf(numbuf, NUMBUF_LEN, "%.17lg", f); + i = snprintf(numbuf, NUMBUF_LEN, "%.15lg", f); + if (i >= 15 && sscanf(numbuf, "%lg", &ftmp) == 1 && ftmp != f) { + i = snprintf(numbuf, NUMBUF_LEN, "%.16lg", f); + if (i >= 16 && sscanf(numbuf, "%lg", &ftmp) == 1 && ftmp != f) { + i = snprintf(numbuf, NUMBUF_LEN, "%.17lg", f); + } } if (!strchr(numbuf, '.') && !strchr(numbuf, 'e')) { numbuf[i++] = '.'; numbuf[i++] = '0'; numbuf[i++] = '\0'; diff --git a/tests/r7rs-tests.scm b/tests/r7rs-tests.scm index 3caf551b..1ec27a38 100644 --- a/tests/r7rs-tests.scm +++ b/tests/r7rs-tests.scm @@ -2366,13 +2366,13 @@ (eqv? n (string->number (car ls))))))))) (test-precision "-1.7976931348623157e+308" "-inf.0") -(test-precision "4.940656458412465e-324" "5.0e-324" "0.0") -(test-precision "9.881312916824931e-324" "1.0e-323" "0.0") +(test-precision "4.940656458412465e-324" "4.94065645841247e-324" "5.0e-324" "0.0") +(test-precision "9.881312916824931e-324" "9.88131291682493e-324" "1.0e-323" "0.0") (test-precision "1.48219693752374e-323" "1.5e-323" "0.0") -(test-precision "1.976262583364986e-323" "2.0e-323" "0.0") -(test-precision "2.470328229206233e-323" "2.5e-323" "0.0") -(test-precision "2.420921664622108e-322" "2.4e-322" "0.0") -(test-precision "2.420921664622108e-320" "2.421e-320" "0.0") +(test-precision "1.976262583364986e-323" "1.97626258336499e-323" "2.0e-323" "0.0") +(test-precision "2.470328229206233e-323" "2.47032822920623e-323" "2.5e-323" "0.0") +(test-precision "2.420921664622108e-322" "2.42092166462211e-322" "2.4e-322" "0.0") +(test-precision "2.420921664622108e-320" "2.42092166462211e-320" "2.421e-320" "0.0") (test-precision "1.4489974452386991" "1.4489975") (test-precision "0.14285714285714282" "0.14285714285714288" "0.14285715") (test-precision "1.7976931348623157e+308" "+inf.0")