12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394 |
- #include <math.h>
- #include <endian.h>
- typedef union
- {
- struct {
- #if (__BYTE_ORDER == __BIG_ENDIAN)
- unsigned long int hi;
- unsigned long int lo;
- #else
- unsigned long int lo;
- unsigned long int hi;
- #endif
- } words;
- double dbl;
- } DblInHex;
- static const double twoTo1023 = 8.988465674311579539e307;
- static const double twoToM1022 = 2.225073858507201383e-308;
- libm_hidden_proto(scalb)
- #ifdef _SCALB_INT
- double scalb ( double x, int n )
- #else
- double scalb ( double x, double n )
- #endif
- {
- DblInHex xInHex;
- xInHex.words.lo = 0UL;
- if ( n > 1023 )
- {
- if ( n > 2097 )
- return ( ( x * twoTo1023 ) * twoTo1023 ) * twoTo1023;
- while ( n > 1023 )
- {
- x *= twoTo1023;
- n -= 1023;
- }
- }
- else if ( n < -1022 )
- {
- if ( n < -2098 )
- return ( ( x * twoToM1022 ) * twoToM1022 ) * twoToM1022;
- while ( n < -1022 )
- {
- x *= twoToM1022;
- n += 1022;
- }
- }
- xInHex.words.hi = ( ( unsigned long ) ( n + 1023 ) ) << 20;
- return ( x * xInHex.dbl );
- }
- libm_hidden_def(scalb)
|