xref: /plan9/sys/src/libc/port/pow10.c (revision 59cc4ca53493a3c6d2349fe2b7f7c40f7dce7294)
13e12c5d1SDavid du Colombier #include	<u.h>
23e12c5d1SDavid du Colombier #include	<libc.h>
33e12c5d1SDavid du Colombier 
4bd389b36SDavid du Colombier /*
5bd389b36SDavid du Colombier  * this table might overflow 127-bit exponent representations.
6bd389b36SDavid du Colombier  * in that case, truncate it after 1.0e38.
7bd389b36SDavid du Colombier  * it is important to get all one can from this
8bd389b36SDavid du Colombier  * routine since it is used in atof to scale numbers.
9bd389b36SDavid du Colombier  * the presumption is that C converts fp numbers better
10bd389b36SDavid du Colombier  * than multipication of lower powers of 10.
11bd389b36SDavid du Colombier  */
123e12c5d1SDavid du Colombier static
13bd389b36SDavid du Colombier double	tab[] =
143e12c5d1SDavid du Colombier {
15bd389b36SDavid du Colombier 	1.0e0,  1.0e1,  1.0e2,  1.0e3,  1.0e4,  1.0e5,  1.0e6,  1.0e7,  1.0e8,  1.0e9,
16bd389b36SDavid du Colombier 	1.0e10, 1.0e11, 1.0e12, 1.0e13, 1.0e14, 1.0e15, 1.0e16, 1.0e17, 1.0e18, 1.0e19,
17bd389b36SDavid du Colombier 	1.0e20, 1.0e21, 1.0e22, 1.0e23, 1.0e24, 1.0e25, 1.0e26, 1.0e27, 1.0e28, 1.0e29,
18bd389b36SDavid du Colombier 	1.0e30, 1.0e31, 1.0e32, 1.0e33, 1.0e34, 1.0e35, 1.0e36, 1.0e37, 1.0e38, 1.0e39,
19bd389b36SDavid du Colombier 	1.0e40, 1.0e41, 1.0e42, 1.0e43, 1.0e44, 1.0e45, 1.0e46, 1.0e47, 1.0e48, 1.0e49,
20bd389b36SDavid du Colombier 	1.0e50, 1.0e51, 1.0e52, 1.0e53, 1.0e54, 1.0e55, 1.0e56, 1.0e57, 1.0e58, 1.0e59,
21bd389b36SDavid du Colombier 	1.0e60, 1.0e61, 1.0e62, 1.0e63, 1.0e64, 1.0e65, 1.0e66, 1.0e67, 1.0e68, 1.0e69,
22*59cc4ca5SDavid du Colombier 	1.0e70, 1.0e71, 1.0e72, 1.0e73, 1.0e74, 1.0e75, 1.0e76, 1.0e77, 1.0e78, 1.0e79,
23*59cc4ca5SDavid du Colombier 	1.0e80, 1.0e81, 1.0e82, 1.0e83, 1.0e84, 1.0e85, 1.0e86, 1.0e87, 1.0e88, 1.0e89,
24*59cc4ca5SDavid du Colombier 	1.0e90, 1.0e91, 1.0e92, 1.0e93, 1.0e94, 1.0e95, 1.0e96, 1.0e97, 1.0e98, 1.0e99,
25*59cc4ca5SDavid du Colombier 	1.0e100,1.0e101,1.0e102,1.0e103,1.0e104,1.0e105,1.0e106,1.0e107,1.0e108,1.0e109,
26*59cc4ca5SDavid du Colombier 	1.0e110,1.0e111,1.0e112,1.0e113,1.0e114,1.0e115,1.0e116,1.0e117,1.0e118,1.0e119,
27*59cc4ca5SDavid du Colombier 	1.0e120,1.0e121,1.0e122,1.0e123,1.0e124,1.0e125,1.0e126,1.0e127,1.0e128,1.0e129,
28*59cc4ca5SDavid du Colombier 	1.0e130,1.0e131,1.0e132,1.0e133,1.0e134,1.0e135,1.0e136,1.0e137,1.0e138,1.0e139,
29*59cc4ca5SDavid du Colombier 	1.0e140,1.0e141,1.0e142,1.0e143,1.0e144,1.0e145,1.0e146,1.0e147,1.0e148,1.0e149,
30*59cc4ca5SDavid du Colombier 	1.0e150,1.0e151,1.0e152,1.0e153,1.0e154,1.0e155,1.0e156,1.0e157,1.0e158,1.0e159,
313e12c5d1SDavid du Colombier };
323e12c5d1SDavid du Colombier 
333e12c5d1SDavid du Colombier double
pow10(int n)343e12c5d1SDavid du Colombier pow10(int n)
353e12c5d1SDavid du Colombier {
363e12c5d1SDavid du Colombier 	int m;
373e12c5d1SDavid du Colombier 
38bd389b36SDavid du Colombier 	if(n < 0) {
39bd389b36SDavid du Colombier 		n = -n;
40bd389b36SDavid du Colombier 		if(n < sizeof(tab)/sizeof(tab[0]))
41bd389b36SDavid du Colombier 			return 1/tab[n];
42bd389b36SDavid du Colombier 		m = n/2;
43*59cc4ca5SDavid du Colombier 		return 1/(pow10(m) * pow10(n-m));
44bd389b36SDavid du Colombier 	}
453e12c5d1SDavid du Colombier 	if(n < sizeof(tab)/sizeof(tab[0]))
463e12c5d1SDavid du Colombier 		return tab[n];
473e12c5d1SDavid du Colombier 	m = n/2;
483e12c5d1SDavid du Colombier 	return pow10(m) * pow10(n-m);
493e12c5d1SDavid du Colombier }
50