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:
parent
3070dd00e9
commit
96854fe254
|
@ -609,7 +609,9 @@ namespace std
|
||||||
_M_convert_float(_OutIter __s, ios_base& __io, _CharT __fill, char __mod,
|
_M_convert_float(_OutIter __s, ios_base& __io, _CharT __fill, char __mod,
|
||||||
_ValueT __v) const
|
_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();
|
streamsize __prec = __io.precision();
|
||||||
// Protect against sprintf() buffer overflows.
|
// Protect against sprintf() buffer overflows.
|
||||||
if (__prec > static_cast<streamsize>(__max_digits))
|
if (__prec > static_cast<streamsize>(__max_digits))
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
// 1999-11-15 Kevin Ediger <kediger@licor.com>
|
// 1999-11-15 Kevin Ediger <kediger@licor.com>
|
||||||
// test the floating point inserters (facet num_put)
|
// 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
|
// 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
|
// software; you can redistribute it and/or modify it under the
|
||||||
|
@ -20,6 +20,8 @@
|
||||||
// USA.
|
// USA.
|
||||||
|
|
||||||
#include <cstdio> // for sprintf
|
#include <cstdio> // for sprintf
|
||||||
|
#include <cmath> // for abs
|
||||||
|
#include <cfloat> // for DBL_EPSILON
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <iomanip>
|
#include <iomanip>
|
||||||
#include <locale>
|
#include <locale>
|
||||||
|
@ -355,6 +357,21 @@ test04()
|
||||||
return 0;
|
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
|
int
|
||||||
main()
|
main()
|
||||||
{
|
{
|
||||||
|
@ -362,6 +379,7 @@ main()
|
||||||
test02();
|
test02();
|
||||||
test03();
|
test03();
|
||||||
test04();
|
test04();
|
||||||
|
test05();
|
||||||
#ifdef TEST_NUMPUT_VERBOSE
|
#ifdef TEST_NUMPUT_VERBOSE
|
||||||
cout << "Test passed!" << endl;
|
cout << "Test passed!" << endl;
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue