locale_facets.tcc (num_put::_M_convert_float): Allow one more digit of precision.

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.

From-SVN: r50470
This commit is contained in:
Scott Snyder 2002-03-09 02:01:34 +00:00 committed by Benjamin Kosnik
parent 3070dd00e9
commit 96854fe254
2 changed files with 22 additions and 2 deletions

View File

@ -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))

View File

@ -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