s_ldexp.c 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. /*******************************************************************************
  2. * *
  3. * File frexpldexp.c, *
  4. * Functions frexp(x) and ldexp(x), *
  5. * Implementation of frexp and ldexp functions for the PowerPC. *
  6. * *
  7. * Copyright © 1991 Apple Computer, Inc. All rights reserved. *
  8. * *
  9. * Written by Ali Sazegari, started on January 1991, *
  10. * *
  11. * W A R N I N G: This routine expects a 64 bit double model. *
  12. * *
  13. * December03 1992: first rs6000 implementation. *
  14. * October 05 1993: added special cases for NaN and ° in frexp. *
  15. * May 27 1997: improved the performance of frexp by eliminating the *
  16. * switch statement. *
  17. * June 13 2001: (ram) rewrote frexp to eliminate calls to scalb and *
  18. * logb. *
  19. * *
  20. *******************************************************************************/
  21. #include <limits.h>
  22. #include <math.h>
  23. typedef union
  24. {
  25. struct {
  26. #if defined(__BIG_ENDIAN__)
  27. unsigned long int hi;
  28. unsigned long int lo;
  29. #else
  30. unsigned long int lo;
  31. unsigned long int hi;
  32. #endif
  33. } words;
  34. double dbl;
  35. } DblInHex;
  36. double ldexp ( double value, int exp )
  37. {
  38. if ( exp > SHRT_MAX )
  39. exp = SHRT_MAX;
  40. else if ( exp < -SHRT_MAX )
  41. exp = -SHRT_MAX;
  42. return scalb ( value, exp );
  43. }