sprintf precision ranges from 15 to 17

This commit is contained in:
Alex Shinn 2017-10-22 22:24:15 +09:00
parent c5effc536f
commit e4eadba355
2 changed files with 12 additions and 9 deletions

3
sexp.c
View file

@ -1913,10 +1913,13 @@ sexp sexp_write_one (sexp ctx, sexp obj, sexp out) {
} else } else
#endif #endif
{ {
i = snprintf(numbuf, NUMBUF_LEN, "%.15lg", f);
if (i >= 15 && sscanf(numbuf, "%lg", &ftmp) == 1 && ftmp != f) {
i = snprintf(numbuf, NUMBUF_LEN, "%.16lg", f); i = snprintf(numbuf, NUMBUF_LEN, "%.16lg", f);
if (i >= 16 && sscanf(numbuf, "%lg", &ftmp) == 1 && ftmp != f) { if (i >= 16 && sscanf(numbuf, "%lg", &ftmp) == 1 && ftmp != f) {
i = snprintf(numbuf, NUMBUF_LEN, "%.17lg", f); i = snprintf(numbuf, NUMBUF_LEN, "%.17lg", f);
} }
}
if (!strchr(numbuf, '.') && !strchr(numbuf, 'e')) { if (!strchr(numbuf, '.') && !strchr(numbuf, 'e')) {
numbuf[i++] = '.'; numbuf[i++] = '0'; numbuf[i++] = '\0'; numbuf[i++] = '.'; numbuf[i++] = '0'; numbuf[i++] = '\0';
} }

View file

@ -2366,13 +2366,13 @@
(eqv? n (string->number (car ls))))))))) (eqv? n (string->number (car ls)))))))))
(test-precision "-1.7976931348623157e+308" "-inf.0") (test-precision "-1.7976931348623157e+308" "-inf.0")
(test-precision "4.940656458412465e-324" "5.0e-324" "0.0") (test-precision "4.940656458412465e-324" "4.94065645841247e-324" "5.0e-324" "0.0")
(test-precision "9.881312916824931e-324" "1.0e-323" "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.48219693752374e-323" "1.5e-323" "0.0")
(test-precision "1.976262583364986e-323" "2.0e-323" "0.0") (test-precision "1.976262583364986e-323" "1.97626258336499e-323" "2.0e-323" "0.0")
(test-precision "2.470328229206233e-323" "2.5e-323" "0.0") (test-precision "2.470328229206233e-323" "2.47032822920623e-323" "2.5e-323" "0.0")
(test-precision "2.420921664622108e-322" "2.4e-322" "0.0") (test-precision "2.420921664622108e-322" "2.42092166462211e-322" "2.4e-322" "0.0")
(test-precision "2.420921664622108e-320" "2.421e-320" "0.0") (test-precision "2.420921664622108e-320" "2.42092166462211e-320" "2.421e-320" "0.0")
(test-precision "1.4489974452386991" "1.4489975") (test-precision "1.4489974452386991" "1.4489975")
(test-precision "0.14285714285714282" "0.14285714285714288" "0.14285715") (test-precision "0.14285714285714282" "0.14285714285714288" "0.14285715")
(test-precision "1.7976931348623157e+308" "+inf.0") (test-precision "1.7976931348623157e+308" "+inf.0")