ldexp.c 464 B

1234567891011121314151617181920212223242526272829303132333435
  1. /* $Id$ */
  2. #ifndef NOFLOAT
  3. extern double frexp();
  4. double
  5. ldexp(fl,exp)
  6. double fl;
  7. int exp;
  8. {
  9. int sign = 1;
  10. int currexp;
  11. if (fl<0) {
  12. fl = -fl;
  13. sign = -1;
  14. }
  15. fl = frexp(fl,&currexp);
  16. exp += currexp;
  17. if (exp > 0) {
  18. while (exp>30) {
  19. fl *= (double) (1L << 30);
  20. exp -= 30;
  21. }
  22. fl *= (double) (1L << exp);
  23. }
  24. else {
  25. while (exp<-30) {
  26. fl /= (double) (1L << 30);
  27. exp += 30;
  28. }
  29. fl /= (double) (1L << -exp);
  30. }
  31. return sign * fl;
  32. }
  33. #endif