103 lines
2.1 KiB
C++
103 lines
2.1 KiB
C++
|
/****************************************************************
|
||
|
*
|
||
|
* The author of this software is David M. Gay.
|
||
|
*
|
||
|
* Copyright (c) 1991, 1996 by Lucent Technologies.
|
||
|
*
|
||
|
* Permission to use, copy, modify, and distribute this software for any
|
||
|
* purpose without fee is hereby granted, provided that this entire notice
|
||
|
* is included in all copies of any software which is or includes a copy
|
||
|
* or modification of this software and in all copies of the supporting
|
||
|
* documentation for such software.
|
||
|
*
|
||
|
* THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
|
||
|
* WARRANTY. IN PARTICULAR, NEITHER THE AUTHOR NOR LUCENT MAKES ANY
|
||
|
* REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
|
||
|
* OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
|
||
|
*
|
||
|
***************************************************************/
|
||
|
|
||
|
/* g_fmt(buf,x) stores the closest decimal approximation to x in buf;
|
||
|
* it suffices to declare buf
|
||
|
* char buf[32];
|
||
|
*/
|
||
|
|
||
|
#include "dmg_fp.h"
|
||
|
|
||
|
namespace dmg_fp {
|
||
|
|
||
|
char *
|
||
|
g_fmt(register char *b, double x)
|
||
|
{
|
||
|
register int i, k;
|
||
|
register char *s;
|
||
|
int decpt, j, sign;
|
||
|
char *b0, *s0, *se;
|
||
|
|
||
|
b0 = b;
|
||
|
#ifdef IGNORE_ZERO_SIGN
|
||
|
if (!x) {
|
||
|
*b++ = '0';
|
||
|
*b = 0;
|
||
|
goto done;
|
||
|
}
|
||
|
#endif
|
||
|
s = s0 = dtoa(x, 0, 0, &decpt, &sign, &se);
|
||
|
if (sign)
|
||
|
*b++ = '-';
|
||
|
if (decpt == 9999) /* Infinity or Nan */ {
|
||
|
while((*b++ = *s++)) {}
|
||
|
goto done0;
|
||
|
}
|
||
|
if (decpt <= -4 || decpt > se - s + 5) {
|
||
|
*b++ = *s++;
|
||
|
if (*s) {
|
||
|
*b++ = '.';
|
||
|
while((*b = *s++))
|
||
|
b++;
|
||
|
}
|
||
|
*b++ = 'e';
|
||
|
/* sprintf(b, "%+.2d", decpt - 1); */
|
||
|
if (--decpt < 0) {
|
||
|
*b++ = '-';
|
||
|
decpt = -decpt;
|
||
|
}
|
||
|
else
|
||
|
*b++ = '+';
|
||
|
for(j = 2, k = 10; 10*k <= decpt; j++, k *= 10) {}
|
||
|
for(;;) {
|
||
|
i = decpt / k;
|
||
|
*b++ = i + '0';
|
||
|
if (--j <= 0)
|
||
|
break;
|
||
|
decpt -= i*k;
|
||
|
decpt *= 10;
|
||
|
}
|
||
|
*b = 0;
|
||
|
}
|
||
|
else if (decpt <= 0) {
|
||
|
*b++ = '.';
|
||
|
for(; decpt < 0; decpt++)
|
||
|
*b++ = '0';
|
||
|
while((*b++ = *s++)) {}
|
||
|
}
|
||
|
else {
|
||
|
while((*b = *s++)) {
|
||
|
b++;
|
||
|
if (--decpt == 0 && *s)
|
||
|
*b++ = '.';
|
||
|
}
|
||
|
for(; decpt > 0; decpt--)
|
||
|
*b++ = '0';
|
||
|
*b = 0;
|
||
|
}
|
||
|
done0:
|
||
|
freedtoa(s0);
|
||
|
#ifdef IGNORE_ZERO_SIGN
|
||
|
done:
|
||
|
#endif
|
||
|
return b0;
|
||
|
}
|
||
|
|
||
|
} // namespace dmg_fp
|