From 1efff400b24ea723542836ac1e0e7d9f3c51b861 Mon Sep 17 00:00:00 2001 From: paolo Date: Mon, 6 Jan 2003 15:32:16 +0000 Subject: [PATCH] 2003-01-06 Paolo Carlini PR libstdc++/9151 * include/bits/locale_facets.cc (num_put::_M_convert_float): Limit __prec to digits10 + 2, not digits10 + 1, taking into account the possibility of %{g,G} conversion specifiers inside _S_format_float. * testsuite/27_io/ostream_inserter_arith.cc (test06): Add. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@60939 138bc75d-0d04-0410-961f-82ee72b054a4 --- libstdc++-v3/ChangeLog | 9 +++++++++ libstdc++-v3/include/bits/locale_facets.tcc | 9 +++++++-- .../testsuite/27_io/ostream_inserter_arith.cc | 22 +++++++++++++++++++++- 3 files changed, 37 insertions(+), 3 deletions(-) diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 1ea147c..4f9d78d 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,12 @@ +2003-01-06 Paolo Carlini + + PR libstdc++/9151 + * include/bits/locale_facets.cc (num_put::_M_convert_float): + Limit __prec to digits10 + 2, not digits10 + 1, taking into + account the possibility of %{g,G} conversion specifiers + inside _S_format_float. + * testsuite/27_io/ostream_inserter_arith.cc (test06): Add. + 2003-01-06 Kaveh R. Ghazi * testsuite/lib/libstdc++-v3-dg.exp (libstdc++-v3-init, diff --git a/libstdc++-v3/include/bits/locale_facets.tcc b/libstdc++-v3/include/bits/locale_facets.tcc index 75def8f..26915e7 100644 --- a/libstdc++-v3/include/bits/locale_facets.tcc +++ b/libstdc++-v3/include/bits/locale_facets.tcc @@ -622,9 +622,14 @@ namespace std _M_convert_float(_OutIter __s, ios_base& __io, _CharT __fill, char __mod, _ValueT __v) const { - // Note: digits10 is rounded down. We need to add 1 to ensure + // Note: digits10 is rounded down: we need to add 1 to ensure // we get the full available precision. - const int __max_digits = numeric_limits<_ValueT>::digits10 + 1; + // Then, in general, one more 1 needs to be added since, when the + // %{g,G} conversion specifiers are chosen inside _S_format_float, the + // precision field is "the maximum number of significant digits", *not* + // the "number of digits to appear after the decimal point", as happens + // for %{e,E,f,F} (C99, 7.19.6.1,4). + const int __max_digits = numeric_limits<_ValueT>::digits10 + 2; streamsize __prec = __io.precision(); if (__prec > static_cast(__max_digits)) diff --git a/libstdc++-v3/testsuite/27_io/ostream_inserter_arith.cc b/libstdc++-v3/testsuite/27_io/ostream_inserter_arith.cc index 041f314..e4e618d 100644 --- a/libstdc++-v3/testsuite/27_io/ostream_inserter_arith.cc +++ b/libstdc++-v3/testsuite/27_io/ostream_inserter_arith.cc @@ -368,7 +368,26 @@ test05() istringstream istr (sval); double d; istr >> d; - VERIFY (abs(pi-d)/pi < DBL_EPSILON); + VERIFY( abs(pi-d)/pi < DBL_EPSILON ); + return 0; +} + + +// libstdc++/9151 +int +test06() +{ + int prec = numeric_limits::digits10 + 2; + double oval = numeric_limits::min(); + + stringstream ostr; + ostr.precision(prec); + ostr << oval; + string sval = ostr.str(); + istringstream istr (sval); + double ival; + istr >> ival; + VERIFY( abs(oval-ival)/oval < DBL_EPSILON ); return 0; } @@ -380,6 +399,7 @@ main() test03(); test04(); test05(); + test06(); #ifdef TEST_NUMPUT_VERBOSE cout << "Test passed!" << endl; #endif -- 2.7.4