diff --git a/libstdc++-v3/include/bits/locale_facets.tcc b/libstdc++-v3/include/bits/locale_facets.tcc index e08dc363a9d..3c8fea13024 100644 --- a/libstdc++-v3/include/bits/locale_facets.tcc +++ b/libstdc++-v3/include/bits/locale_facets.tcc @@ -609,7 +609,9 @@ namespace std _M_convert_float(_OutIter __s, ios_base& __io, _CharT __fill, char __mod, _ValueT __v) const { - const int __max_digits = numeric_limits<_ValueT>::digits10; + // 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; streamsize __prec = __io.precision(); // Protect against sprintf() buffer overflows. 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 bbe2759106d..041f3149011 100644 --- a/libstdc++-v3/testsuite/27_io/ostream_inserter_arith.cc +++ b/libstdc++-v3/testsuite/27_io/ostream_inserter_arith.cc @@ -1,7 +1,7 @@ // 1999-11-15 Kevin Ediger // test the floating point inserters (facet num_put) -// Copyright (C) 1999 Free Software Foundation, Inc. +// Copyright (C) 1999, 2002 Free Software Foundation, Inc. // // This file is part of the GNU ISO C++ Library. This library is free // software; you can redistribute it and/or modify it under the @@ -20,6 +20,8 @@ // USA. #include // for sprintf +#include // for abs +#include // for DBL_EPSILON #include #include #include @@ -355,6 +357,21 @@ test04() return 0; } +int +test05() +{ + double pi = 3.14159265358979323846; + ostringstream ostr; + ostr.precision(20); + ostr << pi; + string sval = ostr.str(); + istringstream istr (sval); + double d; + istr >> d; + VERIFY (abs(pi-d)/pi < DBL_EPSILON); + return 0; +} + int main() { @@ -362,6 +379,7 @@ main() test02(); test03(); test04(); + test05(); #ifdef TEST_NUMPUT_VERBOSE cout << "Test passed!" << endl; #endif