unix/fiss

lib/libfmt/pow10.c in master
Repositories | Summary | Log | Files | LICENSE

pow10.c (1438B) download


  1/* Copyright (c) 2002-2006 Lucent Technologies; see LICENSE */
  2#include "fmt.h"
  3#include "fmtdef.h"
  4#include "plan9.h"
  5
  6#include <stdarg.h>
  7#include <string.h>
  8
  9/*
 10 * this table might overflow 127-bit exponent representations.
 11 * in that case, truncate it after 1.0e38.
 12 * it is important to get all one can from this
 13 * routine since it is used in atof to scale numbers.
 14 * the presumption is that C converts fp numbers better
 15 * than multipication of lower powers of 10.
 16 */
 17
 18static double tab[] = {
 19	1.0e0,
 20	1.0e1,
 21	1.0e2,
 22	1.0e3,
 23	1.0e4,
 24	1.0e5,
 25	1.0e6,
 26	1.0e7,
 27	1.0e8,
 28	1.0e9,
 29	1.0e10,
 30	1.0e11,
 31	1.0e12,
 32	1.0e13,
 33	1.0e14,
 34	1.0e15,
 35	1.0e16,
 36	1.0e17,
 37	1.0e18,
 38	1.0e19,
 39	1.0e20,
 40	1.0e21,
 41	1.0e22,
 42	1.0e23,
 43	1.0e24,
 44	1.0e25,
 45	1.0e26,
 46	1.0e27,
 47	1.0e28,
 48	1.0e29,
 49	1.0e30,
 50	1.0e31,
 51	1.0e32,
 52	1.0e33,
 53	1.0e34,
 54	1.0e35,
 55	1.0e36,
 56	1.0e37,
 57	1.0e38,
 58	1.0e39,
 59	1.0e40,
 60	1.0e41,
 61	1.0e42,
 62	1.0e43,
 63	1.0e44,
 64	1.0e45,
 65	1.0e46,
 66	1.0e47,
 67	1.0e48,
 68	1.0e49,
 69	1.0e50,
 70	1.0e51,
 71	1.0e52,
 72	1.0e53,
 73	1.0e54,
 74	1.0e55,
 75	1.0e56,
 76	1.0e57,
 77	1.0e58,
 78	1.0e59,
 79	1.0e60,
 80	1.0e61,
 81	1.0e62,
 82	1.0e63,
 83	1.0e64,
 84	1.0e65,
 85	1.0e66,
 86	1.0e67,
 87	1.0e68,
 88	1.0e69,
 89};
 90
 91double
 92__fmtpow10(int n) {
 93	int m;
 94
 95	if (n < 0) {
 96		n = -n;
 97		if (n < (int) (sizeof(tab) / sizeof(tab[0])))
 98			return 1 / tab[n];
 99		m = n / 2;
100		return __fmtpow10(-m) * __fmtpow10(m - n);
101	}
102	if (n < (int) (sizeof(tab) / sizeof(tab[0])))
103		return tab[n];
104	m = n / 2;
105	return __fmtpow10(m) * __fmtpow10(n - m);
106}