diff options
author | bkoz <bkoz@138bc75d-0d04-0410-961f-82ee72b054a4> | 2002-03-09 02:01:34 +0000 |
---|---|---|
committer | bkoz <bkoz@138bc75d-0d04-0410-961f-82ee72b054a4> | 2002-03-09 02:01:34 +0000 |
commit | 1d1bff46991a6eb5f3cd238af9591579fedc0a0e (patch) | |
tree | 2776f7a9be6f9f84b9e2b17edbefe0efdfa9d447 | |
parent | 56c1f669540b2ee7b258bcbfd035ab98069ea599 (diff) | |
download | gcc-1d1bff46991a6eb5f3cd238af9591579fedc0a0e.tar.gz |
2002-03-08 scott snyder <snyder@fnal.gov>
libstdc++/5875
* include/bits/locale_facets.tcc (num_put::_M_convert_float):
Allow one more digit of precision.
* testsuite/27_io/ostream_inserter_arith.cc: Test that we can
write a double and read back in the same value.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@50470 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | libstdc++-v3/include/bits/locale_facets.tcc | 4 | ||||
-rw-r--r-- | libstdc++-v3/testsuite/27_io/ostream_inserter_arith.cc | 20 |
2 files changed, 22 insertions, 2 deletions
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<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 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 <kediger@licor.com> // 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 <cstdio> // for sprintf +#include <cmath> // for abs +#include <cfloat> // for DBL_EPSILON #include <iostream> #include <iomanip> #include <locale> @@ -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 |