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