Задача: Арктангенс
Исходник: Арктангенс, язык: C++ [code #549, hits: 24287]
автор: - [добавлен: 19.12.2007]
  1. double fgAtan(double x) {
  2. double atanhi[4], atanlo[4], aT[11];
  3. double w,s1,s2,z;
  4. int32_t ix,hx,id;
  5.  
  6. atanhi[0] = 4.63647609000806093515e-01;
  7. /* atan(0.5)hi 0x3FDDAC67, 0x0561BB4F */
  8. atanhi[1] = 7.85398163397448278999e-01;
  9. /* atan(1.0)hi 0x3FE921FB, 0x54442D18 */
  10. atanhi[2] = 9.82793723247329054082e-01;
  11. /* atan(1.5)hi 0x3FEF730B, 0xD281F69B */
  12. atanhi[3] = 1.57079632679489655800e+00;
  13. /* atan(inf)hi 0x3FF921FB, 0x54442D18 */
  14. atanlo[0] = 2.26987774529616870924e-17;
  15. /* atan(0.5)lo 0x3C7A2B7F, 0x222F65E2 */
  16. atanlo[1] = 3.06161699786838301793e-17;
  17. /* atan(1.0)lo 0x3C81A626, 0x33145C07 */
  18. atanlo[2] = 1.39033110312309984516e-17;
  19. /* atan(1.5)lo 0x3C700788, 0x7AF0CBBD */
  20. atanlo[3] = 6.12323399573676603587e-17;
  21. /* atan(inf)lo 0x3C91A626, 0x33145C07 */
  22. aT[0] = 3.33333333333329318027e-01; /* 0x3FD55555, 0x5555550D */
  23. aT[1] = -1.99999999998764832476e-01; /* 0xBFC99999, 0x9998EBC4 */
  24. aT[2] = 1.42857142725034663711e-01; /* 0x3FC24924, 0x920083FF */
  25. aT[3] = -1.11111104054623557880e-01; /* 0xBFBC71C6, 0xFE231671 */
  26. aT[4] = 9.09088713343650656196e-02; /* 0x3FB745CD, 0xC54C206E */
  27. aT[5] = -7.69187620504482999495e-02; /* 0xBFB3B0F2, 0xAF749A6D */
  28. aT[6] = 6.66107313738753120669e-02; /* 0x3FB10D66, 0xA0D03D51 */
  29. aT[7] = -5.83357013379057348645e-02; /* 0xBFADDE2D, 0x52DEFD9A */
  30. aT[8] = 4.97687799461593236017e-02; /* 0x3FA97B4B, 0x24760DEB */
  31. aT[9] = -3.65315727442169155270e-02; /* 0xBFA2B444, 0x2C6A6C2F */
  32. aT[10]= 1.62858201153657823623e-02; /* 0x3F90AD3A, 0xE322DA11 */
  33.  
  34. GET_HIGH_WORD(hx,x);
  35. ix = hx&0x7fffffff;
  36. if(ix>=0x44100000) { /* if |x| >= 2^66 */
  37. u_int32_t low;
  38. GET_LOW_WORD(low,x);
  39. if(ix>0x7ff00000||
  40. (ix==0x7ff00000&&(low!=0)))
  41. return x+x; /* NaN */
  42. if(hx>0) return atanhi[3]+atanlo[3];
  43. else return -atanhi[3]-atanlo[3];
  44. } if (ix < 0x3fdc0000) { /* |x| < 0.4375 */
  45. if (ix < 0x3e200000) { /* |x| < 2^-29 */
  46. if(huge+x>one) return x; /* raise inexact */
  47. }
  48. id = -1;
  49. } else {
  50. x = __fabs(x);
  51. if (ix < 0x3ff30000) { /* |x| < 1.1875 */
  52. if (ix < 0x3fe60000) { /* 7/16 <=|x|<11/16 */
  53. id = 0; x = (2.0*x-one)/(2.0+x);
  54. } else { /* 11/16<=|x|< 19/16 */
  55. id = 1; x = (x-one)/(x+one);
  56. }
  57. } else {
  58. if (ix < 0x40038000) { /* |x| < 2.4375 */
  59. id = 2; x = (x-1.5)/(one+1.5*x);
  60. } else { /* 2.4375 <= |x| < 2^66 */
  61. id = 3; x = -1.0/x;
  62. }
  63. }}
  64. /* end of argument reduction */
  65. z = x*x;
  66. w = z*z;
  67. /* break sum from i=0 to 10 aT[i]z**(i+1) into odd and even poly */
  68. s1 = z*(aT[0]+w*(aT[2]+w*(aT[4]+w*(aT[6]+w*(aT[8]+w*aT[10])))));
  69. s2 = w*(aT[1]+w*(aT[3]+w*(aT[5]+w*(aT[7]+w*aT[9]))));
  70. if (id<0) return x - x*(s1+s2);
  71. else {
  72. z = atanhi[id] - ((x*(s1+s2) - atanlo[id]) - x);
  73. return (hx<0)? -z:z;
  74. }
  75. }
Источник: http://rsdn.ru/forum/Message.aspx?mid=2129896&only=1

+добавить реализацию