1
0

frexpl.c 438 B

12345678910111213141516171819202122232425
  1. #include <math.h>
  2. #include <inttypes.h>
  3. /* This version is for 80-bit little endian long double */
  4. long double frexpl(long double x, int *e)
  5. {
  6. union { long double ld; uint16_t hw[5]; } y = { x };
  7. int ee = y.hw[4]&0x7fff;
  8. if (!ee) {
  9. if (x) {
  10. x = frexpl(x*0x1p64, e);
  11. *e -= 64;
  12. } else *e = 0;
  13. return x;
  14. } else if (ee == 0x7fff) {
  15. return x;
  16. }
  17. *e = ee - 0x3ffe;
  18. y.hw[4] &= 0x8000;
  19. y.hw[4] |= 0x3ffe;
  20. return y.ld;
  21. }