xref: /inferno-os/libkern/pow10.c (revision 3cd4f1d15146c08f05206d6328ecbc1c7fdc8dfa)
1*3cd4f1d1SCharles Forsyth #ifdef	LINUX_386
2*3cd4f1d1SCharles Forsyth #define	_MATH_H
3*3cd4f1d1SCharles Forsyth #endif
4*3cd4f1d1SCharles 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*3cd4f1d1SCharles Forsyth 	1.0e70, 1.0e71, 1.0e72, 1.0e73, 1.0e74, 1.0e75, 1.0e76, 1.0e77, 1.0e78, 1.0e79,
25*3cd4f1d1SCharles Forsyth 	1.0e80, 1.0e81, 1.0e82, 1.0e83, 1.0e84, 1.0e85, 1.0e86, 1.0e87, 1.0e88, 1.0e89,
26*3cd4f1d1SCharles Forsyth 	1.0e90, 1.0e91, 1.0e92, 1.0e93, 1.0e94, 1.0e95, 1.0e96, 1.0e97, 1.0e98, 1.0e99,
27*3cd4f1d1SCharles Forsyth 	1.0e100,1.0e101,1.0e102,1.0e103,1.0e104,1.0e105,1.0e106,1.0e107,1.0e108,1.0e109,
28*3cd4f1d1SCharles Forsyth 	1.0e110,1.0e111,1.0e112,1.0e113,1.0e114,1.0e115,1.0e116,1.0e117,1.0e118,1.0e119,
29*3cd4f1d1SCharles Forsyth 	1.0e120,1.0e121,1.0e122,1.0e123,1.0e124,1.0e125,1.0e126,1.0e127,1.0e128,1.0e129,
30*3cd4f1d1SCharles Forsyth 	1.0e130,1.0e131,1.0e132,1.0e133,1.0e134,1.0e135,1.0e136,1.0e137,1.0e138,1.0e139,
31*3cd4f1d1SCharles Forsyth 	1.0e140,1.0e141,1.0e142,1.0e143,1.0e144,1.0e145,1.0e146,1.0e147,1.0e148,1.0e149,
32*3cd4f1d1SCharles 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*3cd4f1d1SCharles 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