kf_cos.c 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. /*
  2. * This file is part of the MicroPython project, http://micropython.org/
  3. *
  4. * These math functions are taken from newlib-nano-2, the newlib/libm/math
  5. * directory, available from https://github.com/32bitmicro/newlib-nano-2.
  6. *
  7. * Appropriate copyright headers are reproduced below.
  8. */
  9. /* kf_cos.c -- float version of k_cos.c
  10. * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
  11. */
  12. /*
  13. * ====================================================
  14. * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
  15. *
  16. * Developed at SunPro, a Sun Microsystems, Inc. business.
  17. * Permission to use, copy, modify, and distribute this
  18. * software is freely granted, provided that this notice
  19. * is preserved.
  20. * ====================================================
  21. */
  22. #include "fdlibm.h"
  23. #ifdef __STDC__
  24. static const float
  25. #else
  26. static float
  27. #endif
  28. one = 1.0000000000e+00, /* 0x3f800000 */
  29. C1 = 4.1666667908e-02, /* 0x3d2aaaab */
  30. C2 = -1.3888889225e-03, /* 0xbab60b61 */
  31. C3 = 2.4801587642e-05, /* 0x37d00d01 */
  32. C4 = -2.7557314297e-07, /* 0xb493f27c */
  33. C5 = 2.0875723372e-09, /* 0x310f74f6 */
  34. C6 = -1.1359647598e-11; /* 0xad47d74e */
  35. #ifdef __STDC__
  36. float __kernel_cosf(float x, float y)
  37. #else
  38. float __kernel_cosf(x, y)
  39. float x,y;
  40. #endif
  41. {
  42. float a,hz,z,r,qx;
  43. __int32_t ix;
  44. GET_FLOAT_WORD(ix,x);
  45. ix &= 0x7fffffff; /* ix = |x|'s high word*/
  46. if(ix<0x32000000) { /* if x < 2**27 */
  47. if(((int)x)==0) return one; /* generate inexact */
  48. }
  49. z = x*x;
  50. r = z*(C1+z*(C2+z*(C3+z*(C4+z*(C5+z*C6)))));
  51. if(ix < 0x3e99999a) /* if |x| < 0.3 */
  52. return one - ((float)0.5*z - (z*r - x*y));
  53. else {
  54. if(ix > 0x3f480000) { /* x > 0.78125 */
  55. qx = (float)0.28125;
  56. } else {
  57. SET_FLOAT_WORD(qx,ix-0x01000000); /* x/4 */
  58. }
  59. hz = (float)0.5*z-qx;
  60. a = one-qx;
  61. return a - (hz - (z*r-x*y));
  62. }
  63. }