31
32 /*
33 * scalbl(x,n): return x * 2**n by manipulating exponent.
34 */
35
36 #include "libm.h"
37 #include "longdouble.h"
38
39 #include <sys/isa_defs.h>
40
41 long double
42 scalbl(long double x, long double fn) {
43 int *py = (int *) &fn, n;
44 long double z;
45
46 if (isnanl(x) || isnanl(fn))
47 return x * fn;
48
49 /* fn is +/-Inf */
50 #if defined(_BIG_ENDIAN)
51 if ((py[0] & 0x7fff0000) == 0x7fff0000)
52 if ((py[0] & 0x80000000) != 0)
53 #else
54 if ((py[2] & 0x7fff) == 0x7fff)
55 if ((py[2] & 0x8000) != 0)
56 #endif
57 return x / (-fn);
58 else
59 return x * fn;
60
61 if (rintl(fn) != fn)
62 return (fn - fn) / (fn - fn);
63 if (fn > 65000.0L)
64 z = scalbnl(x, 65000);
65 else if (-fn > 65000.0L)
66 z = scalbnl(x, -65000);
67 else {
68 n = (int) fn;
69 z = scalbnl(x, n);
70 }
71 return z;
72 }
|
31
32 /*
33 * scalbl(x,n): return x * 2**n by manipulating exponent.
34 */
35
36 #include "libm.h"
37 #include "longdouble.h"
38
39 #include <sys/isa_defs.h>
40
41 long double
42 scalbl(long double x, long double fn) {
43 int *py = (int *) &fn, n;
44 long double z;
45
46 if (isnanl(x) || isnanl(fn))
47 return x * fn;
48
49 /* fn is +/-Inf */
50 #if defined(_BIG_ENDIAN)
51 if ((py[0] & 0x7fff0000) == 0x7fff0000) {
52 if ((py[0] & 0x80000000) != 0)
53 #else
54 if ((py[2] & 0x7fff) == 0x7fff) {
55 if ((py[2] & 0x8000) != 0)
56 #endif
57 return x / (-fn);
58 else
59 return x * fn;
60 }
61 if (rintl(fn) != fn)
62 return (fn - fn) / (fn - fn);
63 if (fn > 65000.0L)
64 z = scalbnl(x, 65000);
65 else if (-fn > 65000.0L)
66 z = scalbnl(x, -65000);
67 else {
68 n = (int) fn;
69 z = scalbnl(x, n);
70 }
71 return z;
72 }
|