sinl.c 810 B

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. #include "libm.h"
  2. #if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
  3. long double sinl(long double x)
  4. {
  5. return sin(x);
  6. }
  7. #elif (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384
  8. long double sinl(long double x)
  9. {
  10. union ldshape u = {x};
  11. unsigned n;
  12. long double y[2], hi, lo;
  13. u.i.se &= 0x7fff;
  14. if (u.i.se == 0x7fff)
  15. return x - x;
  16. if (u.f < M_PI_4) {
  17. if (u.i.se < 0x3fff - LDBL_MANT_DIG/2) {
  18. /* raise inexact if x!=0 and underflow if subnormal */
  19. FORCE_EVAL(u.i.se == 0 ? x*0x1p-120f : x+0x1p120f);
  20. return x;
  21. }
  22. return __sinl(x, 0.0, 0);
  23. }
  24. n = __rem_pio2l(x, y);
  25. hi = y[0];
  26. lo = y[1];
  27. switch (n & 3) {
  28. case 0:
  29. return __sinl(hi, lo, 1);
  30. case 1:
  31. return __cosl(hi, lo);
  32. case 2:
  33. return -__sinl(hi, lo, 1);
  34. case 3:
  35. default:
  36. return -__cosl(hi, lo);
  37. }
  38. }
  39. #endif