home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / vol_300 / 329_01 / dprintf_.c < prev    next >
Text File  |  1979-12-31  |  3KB  |  92 lines

  1. /*  >  DPRINTF-F.C
  2.  *
  3.  *  dprintf -- PrintFloat using floor()
  4.  *  (C)  April 4  1990  Asaf Arkin
  5.  *  All rights reserved
  6.  *
  7.  *  Altered PrintFloat does no double to int casts; the math library floor
  8.  *  function is used instead.
  9.  *
  10.  *  PrintFloat and ToFloat perform floating point arithmetic, requiring the
  11.  *  presence of a FP processor or emulator, and the floor() function (rounds
  12.  *  down a double to its integer value.)
  13.  */
  14.  
  15.  
  16. /*  void  PrintFloat(long double, int, int, char, char, int *)
  17.  *
  18.  *  Print a floating point number in standard (%f) or engineering (%e) form;
  19.  *  the %g format requires that the shortest of the two be selected. The
  20.  *  number divides into integer, fraction and exponent parts; the exponent
  21.  *  is stringized with ToInteger, the integer and fraction with ToFloat.
  22.  */
  23.  
  24. static void  PrintFloat(long double Float, int Width, int Precis, char Flags,
  25.                         char Format, int *OutCnt)
  26. {
  27.   :
  28.   long double  Float2;
  29.  
  30.   :
  31.   :
  32.   /*  The mantissa divides into integer and fraction parts, stringized by
  33.    *  ToFloat: the last digit always rounds up; a period is printed only
  34.    *  before a fraction or in the variant format; the %g format allows
  35.    *  trailing zeros in the fraction to be lost.
  36.    *  N.B.: floor rounds only doubles -- long doubles are not catered for.
  37.    */
  38.   Float2=floor(Float);
  39.   Float-=Float2;
  40.   if (Precis<=0 && Float>=.5)
  41.     ++Float2;
  42.   LengthI=ToFloat(&BufferI,(double) Float2,-1);
  43.   if (Precis>0)
  44.   {
  45.     for (LengthF=0; LengthF<Precis; ++LengthF)
  46.       Float*=10;
  47.     Float2=floor(Float);
  48.     Float-=Float2;
  49.     if (Float>=.5)
  50.       ++Float2;
  51.     LengthF=ToFloat(&BufferF,(double) Float2,Precis);
  52.   }
  53.   else
  54.     LengthF=0;
  55.   :
  56.   :
  57. }
  58.  
  59.  
  60. /*  int  ToFloat(char **, double, int)
  61.  *
  62.  *  Convert a double to a NULL-terminated string of digits. If the string has
  63.  *  less digits than the precision, additional zeros are inserted at the
  64.  *  start of it. ToFloat allocates a memory block in which it stores the
  65.  *  string -- Buffer returns its address.
  66.  */
  67.  
  68. static int  ToFloat(char **Buffer, double Float, int Precis)
  69. {
  70.   int  Cnt,  Length,  Char;
  71.   double  TempFloat = Float;
  72.  
  73.   if (Precis<0)
  74.     Precis=1;
  75.   for (Cnt=0; TempFloat>=1; TempFloat/=10, ++Cnt)  ;
  76.   *Buffer=malloc(Maximum(Precis,Cnt)+1);
  77.   if (*Buffer==NULL)
  78.     return  0;
  79.   for (Length=0; Length+Cnt<Precis; )
  80.     (*Buffer)[Length++]='0';
  81.   Cnt= Length=Maximum(Length+Cnt,Precis);
  82.   (*Buffer)[Length]='\0';
  83.   for (; Float>=1; Float/=10)
  84.   {
  85.     Char=floor(Float-floor(Float/10)*10);
  86.     (*Buffer)[--Cnt]=ToDigit(Char);
  87.   }
  88.   return  Length;
  89. }
  90.  
  91.  
  92.