scalbn.c 441 B

12345678910111213141516171819202122232425262728
  1. #include "libm.h"
  2. double scalbn(double x, int n)
  3. {
  4. double scale;
  5. if (n > 1023) {
  6. x *= 0x1p1023;
  7. n -= 1023;
  8. if (n > 1023) {
  9. x *= 0x1p1023;
  10. n -= 1023;
  11. if (n > 1023)
  12. return x * 0x1p1023;
  13. }
  14. } else if (n < -1022) {
  15. x *= 0x1p-1022;
  16. n += 1022;
  17. if (n < -1022) {
  18. x *= 0x1p-1022;
  19. n += 1022;
  20. if (n < -1022)
  21. return x * 0x1p-1022;
  22. }
  23. }
  24. INSERT_WORDS(scale, (uint32_t)(0x3ff+n)<<20, 0);
  25. return x * scale;
  26. }