1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768 |
- #include "complex_impl.h"
- static const uint32_t k = 235;
- static const float kln2 = 162.88958740F;
- static float __frexp_expf(float x, int *expt)
- {
- float exp_x;
- uint32_t hx;
- exp_x = expf(x - kln2);
- GET_FLOAT_WORD(hx, exp_x);
- *expt = (hx >> 23) - (0x7f + 127) + k;
- SET_FLOAT_WORD(exp_x, (hx & 0x7fffff) | ((0x7f + 127) << 23));
- return exp_x;
- }
- float complex __ldexp_cexpf(float complex z, int expt)
- {
- float x, y, exp_x, scale1, scale2;
- int ex_expt, half_expt;
- x = crealf(z);
- y = cimagf(z);
- exp_x = __frexp_expf(x, &ex_expt);
- expt += ex_expt;
- half_expt = expt / 2;
- SET_FLOAT_WORD(scale1, (0x7f + half_expt) << 23);
- half_expt = expt - half_expt;
- SET_FLOAT_WORD(scale2, (0x7f + half_expt) << 23);
- return CMPLXF(cosf(y) * exp_x * scale1 * scale2,
- sinf(y) * exp_x * scale1 * scale2);
- }
|