xref: /inferno-os/lib9/pow10.c (revision 7ded4a527bdfd0e8b3a9049955f2af89e5f039ee)
137da2899SCharles.Forsyth #ifdef	LINUX_386
237da2899SCharles.Forsyth #define	_MATH_H
337da2899SCharles.Forsyth #endif
437da2899SCharles.Forsyth #include	"lib9.h"
537da2899SCharles.Forsyth 
637da2899SCharles.Forsyth /*
737da2899SCharles.Forsyth  * this table might overflow 127-bit exponent representations.
837da2899SCharles.Forsyth  * in that case, truncate it after 1.0e38.
937da2899SCharles.Forsyth  * it is important to get all one can from this
1037da2899SCharles.Forsyth  * routine since it is used in atof to scale numbers.
1137da2899SCharles.Forsyth  * the presumption is that C converts fp numbers better
1237da2899SCharles.Forsyth  * than multipication of lower powers of 10.
1337da2899SCharles.Forsyth  */
1437da2899SCharles.Forsyth static
1537da2899SCharles.Forsyth double	tab[] =
1637da2899SCharles.Forsyth {
1737da2899SCharles.Forsyth 	1.0e0,  1.0e1,  1.0e2,  1.0e3,  1.0e4,  1.0e5,  1.0e6,  1.0e7,  1.0e8,  1.0e9,
1837da2899SCharles.Forsyth 	1.0e10, 1.0e11, 1.0e12, 1.0e13, 1.0e14, 1.0e15, 1.0e16, 1.0e17, 1.0e18, 1.0e19,
1937da2899SCharles.Forsyth 	1.0e20, 1.0e21, 1.0e22, 1.0e23, 1.0e24, 1.0e25, 1.0e26, 1.0e27, 1.0e28, 1.0e29,
2037da2899SCharles.Forsyth 	1.0e30, 1.0e31, 1.0e32, 1.0e33, 1.0e34, 1.0e35, 1.0e36, 1.0e37, 1.0e38, 1.0e39,
2137da2899SCharles.Forsyth 	1.0e40, 1.0e41, 1.0e42, 1.0e43, 1.0e44, 1.0e45, 1.0e46, 1.0e47, 1.0e48, 1.0e49,
2237da2899SCharles.Forsyth 	1.0e50, 1.0e51, 1.0e52, 1.0e53, 1.0e54, 1.0e55, 1.0e56, 1.0e57, 1.0e58, 1.0e59,
2337da2899SCharles.Forsyth 	1.0e60, 1.0e61, 1.0e62, 1.0e63, 1.0e64, 1.0e65, 1.0e66, 1.0e67, 1.0e68, 1.0e69,
24*7ded4a52SCharles Forsyth 	1.0e70, 1.0e71, 1.0e72, 1.0e73, 1.0e74, 1.0e75, 1.0e76, 1.0e77, 1.0e78, 1.0e79,
25*7ded4a52SCharles Forsyth 	1.0e80, 1.0e81, 1.0e82, 1.0e83, 1.0e84, 1.0e85, 1.0e86, 1.0e87, 1.0e88, 1.0e89,
26*7ded4a52SCharles Forsyth 	1.0e90, 1.0e91, 1.0e92, 1.0e93, 1.0e94, 1.0e95, 1.0e96, 1.0e97, 1.0e98, 1.0e99,
27*7ded4a52SCharles Forsyth 	1.0e100,1.0e101,1.0e102,1.0e103,1.0e104,1.0e105,1.0e106,1.0e107,1.0e108,1.0e109,
28*7ded4a52SCharles Forsyth 	1.0e110,1.0e111,1.0e112,1.0e113,1.0e114,1.0e115,1.0e116,1.0e117,1.0e118,1.0e119,
29*7ded4a52SCharles Forsyth 	1.0e120,1.0e121,1.0e122,1.0e123,1.0e124,1.0e125,1.0e126,1.0e127,1.0e128,1.0e129,
30*7ded4a52SCharles Forsyth 	1.0e130,1.0e131,1.0e132,1.0e133,1.0e134,1.0e135,1.0e136,1.0e137,1.0e138,1.0e139,
31*7ded4a52SCharles Forsyth 	1.0e140,1.0e141,1.0e142,1.0e143,1.0e144,1.0e145,1.0e146,1.0e147,1.0e148,1.0e149,
32*7ded4a52SCharles Forsyth 	1.0e150,1.0e151,1.0e152,1.0e153,1.0e154,1.0e155,1.0e156,1.0e157,1.0e158,1.0e159,
3337da2899SCharles.Forsyth };
3437da2899SCharles.Forsyth 
3537da2899SCharles.Forsyth double
pow10(int n)3637da2899SCharles.Forsyth pow10(int n)
3737da2899SCharles.Forsyth {
3837da2899SCharles.Forsyth 	int m;
3937da2899SCharles.Forsyth 
4037da2899SCharles.Forsyth 	if(n < 0) {
4137da2899SCharles.Forsyth 		n = -n;
4237da2899SCharles.Forsyth 		if(n < sizeof(tab)/sizeof(tab[0]))
4337da2899SCharles.Forsyth 			return 1/tab[n];
4437da2899SCharles.Forsyth 		m = n/2;
45*7ded4a52SCharles Forsyth 		return 1/(pow10(m) * pow10(n-m));
4637da2899SCharles.Forsyth 	}
4737da2899SCharles.Forsyth 	if(n < sizeof(tab)/sizeof(tab[0]))
4837da2899SCharles.Forsyth 		return tab[n];
4937da2899SCharles.Forsyth 	m = n/2;
5037da2899SCharles.Forsyth 	return pow10(m) * pow10(n-m);
5137da2899SCharles.Forsyth }
52