public inbox for gcc-prs@sourceware.org
help / color / mirror / Atom feed
From: Scott Snyder <snyder@fnal.gov>
To: paolo@gcc.gnu.org
Cc: gcc-prs@gcc.gnu.org,
Subject: Re: libstdc++/5875: operator<<(double) doesn't allow printing full precision (3.0 regression)
Date: Fri, 08 Mar 2002 12:16:00 -0000	[thread overview]
Message-ID: <20020308201605.3342.qmail@sources.redhat.com> (raw)

The following reply was made to PR libstdc++/5875; it has been noted by GNATS.

From: Scott Snyder <snyder@fnal.gov>
To: paolo@gcc.gnu.org, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org,
        gcc-gnats@gcc.gnu.org
Cc:  
Subject: Re: libstdc++/5875: operator<<(double) doesn't allow printing full precision (3.0 regression)
Date: 08 Mar 2002 14:09:01 -0600

 >    I think your analysis is correct (as it was the first time,
 >    by the way ;-) and I would suggest posting directly the
 >    patch in the libstdc++ list. However, if you want to
 >    provide a testcase, you should do this as a patch against
 >    the concerned testsuite file, in the standard form based on
 >    the use of VERIFY, portable (this is the tricky point)
 >    across archs characterized by different machine precisions.
 >    I mean, do you think it would be safe testing:
 >    VERIFY(d - pi == 0.0) ??
 >    I don't think so. What do you suggest then?
 
 
 Oops --- i see i forgot to include the testsuite patch.  Here's the full
 patch again.  I tried to ensure that they were equal to within a relative
 error of DBL_EPSILON --- it may be that that's a little bit too small though.
 I admit that as of this point, i've only tested it on linux/i86.
 
 sss
 
 
 2002-03-06  scott snyder  <snyder@fnal.gov>
 
 	* 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.
 
 Index: include/bits/locale_facets.tcc
 ===================================================================
 RCS file: /cvs/gcc/egcs/libstdc++-v3/include/bits/locale_facets.tcc,v
 retrieving revision 1.63.2.3
 diff -u -p -c -r1.63.2.3 locale_facets.tcc
 *** locale_facets.tcc	2002/03/05 19:05:05	1.63.2.3
 --- locale_facets.tcc	2002/03/08 19:52:00
 *************** namespace std
 *** 610,616 ****
         _M_convert_float(_OutIter __s, ios_base& __io, _CharT __fill, char __mod,
   		       _ValueT __v) const
         {
 ! 	const int __max_digits = numeric_limits<_ValueT>::digits10;
   	streamsize __prec = __io.precision();
   	// Protect against sprintf() buffer overflows.
   	if (__prec > static_cast<streamsize>(__max_digits))
 --- 610,618 ----
         _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
 !         // 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))
 Index: testsuite/27_io/ostream_inserter_arith.cc
 ===================================================================
 RCS file: /cvs/gcc/egcs/libstdc++-v3/testsuite/27_io/ostream_inserter_arith.cc,v
 retrieving revision 1.15
 diff -u -p -c -r1.15 ostream_inserter_arith.cc
 *** ostream_inserter_arith.cc	2002/01/31 00:03:31	1.15
 --- ostream_inserter_arith.cc	2002/03/08 19:51:23
 ***************
 *** 20,25 ****
 --- 20,27 ----
   // USA.
   
   #include <cstdio> // for sprintf
 + #include <cmath>  // for abs
 + #include <cfloat> // for DBL_EPSILON
   #include <iostream>
   #include <iomanip>
   #include <locale>
 *************** test04()
 *** 355,360 ****
 --- 357,377 ----
     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()
   {
 *************** main()
 *** 362,367 ****
 --- 379,385 ----
     test02();
     test03();
     test04();
 +   test05();
   #ifdef TEST_NUMPUT_VERBOSE
     cout << "Test passed!" << endl;
   #endif


             reply	other threads:[~2002-03-08 20:16 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2002-03-08 12:16 Scott Snyder [this message]
  -- strict thread matches above, loose matches on Subject: below --
2002-03-11 12:16 paolo
2002-03-07 16:38 paolo
2002-03-07 13:26 snyder

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20020308201605.3342.qmail@sources.redhat.com \
    --to=snyder@fnal.gov \
    --cc=gcc-prs@gcc.gnu.org \
    --cc=paolo@gcc.gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).