scalbn.c 551 B

123456789101112131415161718192021222324252627282930313233
  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. STRICT_ASSIGN(double, x, x * 0x1p1023);
  13. return x;
  14. }
  15. }
  16. } else if (n < -1022) {
  17. x *= 0x1p-1022;
  18. n += 1022;
  19. if (n < -1022) {
  20. x *= 0x1p-1022;
  21. n += 1022;
  22. if (n < -1022) {
  23. STRICT_ASSIGN(double, x, x * 0x1p-1022);
  24. return x;
  25. }
  26. }
  27. }
  28. INSERT_WORDS(scale, (uint32_t)(0x3ff+n)<<20, 0);
  29. STRICT_ASSIGN(double, x, x * scale);
  30. return x;
  31. }