home *** CD-ROM | disk | FTP | other *** search
/ NetNews Usenet Archive 1992 #16 / NN_1992_16.iso / spool / gnu / g / lib / bug / 427 < prev    next >
Encoding:
Text File  |  1992-07-23  |  2.4 KB  |  65 lines

  1. Newsgroups: gnu.g++.lib.bug
  2. Path: sparky!uunet!zaphod.mps.ohio-state.edu!cis.ohio-state.edu!gmd.DE!tietz
  3. From: tietz@gmd.DE (Christoph Tietz)
  4. Subject: strange behavior of the __outfloat routine
  5. Message-ID: <tietz.711636509@gmd.de>
  6. Sender: gnulists@ai.mit.edu
  7. Organization: GMD, Sankt Augustin, Germany
  8. Distribution: gnu
  9. Date: Mon, 20 Jul 1992 12:48:29 GMT
  10. Approved: bug-lib-g++@prep.ai.mit.edu
  11. Lines: 52
  12.  
  13. The following test program shows the different behavior of printf and
  14. cout.form on the same numbers:
  15.  
  16. -------------------------------------------------------------------------------
  17. // This may look like C code, but it is really -*- C++ -*-
  18.  
  19. #include <stream.h>
  20. #include <stdio.h>
  21.  
  22. int main () {
  23.  
  24.   printf ("Output for the format %%5.0f :\n");
  25.   printf    ("printf   : <%5.0f>\n", 10.0);
  26.   printf    ("printf   : <%5.0f>\n", 600.0);
  27.   printf    ("printf   : <%5.0f>\n", 2010.0);
  28.   printf    ("printf   : <%5.0f>\n", 10000.0);
  29.   cout << form    ("cout.form: <%5.0f>\n", 10.0);
  30.   cout << form    ("cout.form: <%5.0f>\n", 600.0);
  31.   cout << form    ("cout.form: <%5.0f>\n", 2010.0);
  32.   cout << form    ("cout.form: <%5.0f>\n", 10000.0);
  33. }
  34. -------------------------------------------------------------------------------
  35.  
  36. The problem seems to come up around line 107 in outfloat.C, where the number
  37. of trailing zeroes is calculated and used to decide, whether a decimal point
  38. should be printed. It seems to be neglected, that the precision given with e,
  39. E and f-Formats denotes the number of digits to appear after the decimal
  40. point and NOT the total number of significant digits. It may be connected to
  41. the behavior of the expression: precision-(useful_digits-decpt) that gives
  42. strange results, if decpt is greater than useful_digits.
  43. >From there on numbers get out of line quite soon. In line 121 the unpadded
  44. width is calculated wrongly because show_dot was set erroneously, and in line
  45. 155 then the trailing digits that were printed correctly before the decimal
  46. point are repeated after the decimal point, giving the following quite
  47. bizarre results:
  48.  
  49. Output for the format %5.0f :
  50. printf   : <   10>
  51. printf   : <  600>
  52. printf   : < 2010>
  53. printf   : <10000>
  54. cout.form: <  10.0>
  55. cout.form: < 600.00>
  56. cout.form: <2010.0>
  57. cout.form: <10000.0000>
  58.  
  59. I could not find a simple patch that would work for all possible floating
  60. point formats so I can regrettably only state the problem here. Perhaps
  61. somebody already has a fix??
  62.  
  63.                                                        Christoph Tietz
  64.  
  65.