diff options
author | Paolo Carlini <pcarlini@unitus.it> | 2003-01-06 16:32:16 +0100 |
---|---|---|
committer | Paolo Carlini <paolo@gcc.gnu.org> | 2003-01-06 15:32:16 +0000 |
commit | 87117aa2f3b4674895fb40260fef88789febc490 (patch) | |
tree | 7a6edb9e5546ea45fea46f825c0ce925a1bea593 | |
parent | 8de6a6df286fe3e4cd06063fb6cfaf98b6c80e62 (diff) | |
download | gcc-87117aa2f3b4674895fb40260fef88789febc490.zip gcc-87117aa2f3b4674895fb40260fef88789febc490.tar.gz gcc-87117aa2f3b4674895fb40260fef88789febc490.tar.bz2 |
re PR libstdc++/9151 (std::setprecision limited to 16 digits when outputting a double to a stream)
2003-01-06 Paolo Carlini <pcarlini@unitus.it>
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.
From-SVN: r60939
-rw-r--r-- | libstdc++-v3/ChangeLog | 9 | ||||
-rw-r--r-- | libstdc++-v3/include/bits/locale_facets.tcc | 9 | ||||
-rw-r--r-- | libstdc++-v3/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 <pcarlini@unitus.it> + + 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 <ghazi@caip.rutgers.edu> * 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<streamsize>(__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<double>::digits10 + 2; + double oval = numeric_limits<double>::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 |