18d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/****************************************************************
28d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
38d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * The author of this software is David M. Gay.
48d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
5c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * Copyright (c) 1991, 1996 by Lucent Technologies.
6c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt *
78d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Permission to use, copy, modify, and distribute this software for any
88d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * purpose without fee is hereby granted, provided that this entire notice
98d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * is included in all copies of any software which is or includes a copy
108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * or modification of this software and in all copies of the supporting
118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * documentation for such software.
128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * WARRANTY.  IN PARTICULAR, NEITHER THE AUTHOR NOR LUCENT MAKES ANY
158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
16cf32e60fa7e0d33fe1551a6dba8dcbbec47ea50eDmitry Shmidt * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ***************************************************************/
198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* g_fmt(buf,x) stores the closest decimal approximation to x in buf;
218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * it suffices to declare buf
228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *	char buf[32];
238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "dmg_fp.h"
268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtnamespace dmg_fp {
288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *
308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtg_fmt(register char *b, double x)
318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	register int i, k;
338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	register char *s;
348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int decpt, j, sign;
358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *b0, *s0, *se;
368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	b0 = b;
388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef IGNORE_ZERO_SIGN
398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!x) {
408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		*b++ = '0';
4104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		*b = 0;
428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto done;
438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif
458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	s = s0 = dtoa(x, 0, 0, &decpt, &sign, &se);
468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (sign)
478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		*b++ = '-';
488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (decpt == 9999) /* Infinity or Nan */ {
498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		for(*b = *s++; *b++; *b = *s++) {}
508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto done0;
518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (decpt <= -4 || decpt > se - s + 5) {
538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		*b++ = *s++;
548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (*s) {
558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			*b++ = '.';
568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			for(*b = *s++; *b; *b = *s++)
578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				b++;
588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			}
598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		*b++ = 'e';
608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		/* sprintf(b, "%+.2d", decpt - 1); */
618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (--decpt < 0) {
628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			*b++ = '-';
638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			decpt = -decpt;
648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			}
658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		else
668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			*b++ = '+';
678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		for(j = 2, k = 10; 10*k <= decpt; j++, k *= 10) {}
688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		for(;;) {
698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			i = decpt / k;
708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			*b++ = (char)i + '0';
718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (--j <= 0)
728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				break;
738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			decpt -= i*k;
748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			decpt *= 10;
758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			}
768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		*b = 0;
778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	else if (decpt <= 0) {
798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		*b++ = '.';
808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		for(; decpt < 0; decpt++)
818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			*b++ = '0';
828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		for(*b = *s++; *b++; *b = *s++) {}
838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	else {
858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		for(*b = *s++; *b; *b = *s++) {
868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			b++;
878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (--decpt == 0 && *s)
888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				*b++ = '.';
898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			}
908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		for(; decpt > 0; decpt--)
918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			*b++ = '0';
928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		*b = 0;
938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt done0:
958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	freedtoa(s0);
968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef IGNORE_ZERO_SIGN
978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt done:
988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif
998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return b0;
1008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
1018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}  // namespace dmg_fp
1038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt