Math.Mod.txt 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. MODULE Math; (*Standard functions; NW 12.10.2013*)
  2. PROCEDURE sqrt*(x: REAL): REAL;
  3. CONST c1 = 0.70710680; (* 1/sqrt(2) *)
  4. c2 = 0.590162067;
  5. c3 = 1.4142135; (*sqrt(2)*)
  6. VAR s: REAL; e: INTEGER;
  7. BEGIN ASSERT(x >= 0.0);
  8. IF x > 0.0 THEN
  9. UNPK(x, e);
  10. s := c2*(x+c1);
  11. s := s + (x/s);
  12. s := 0.25*s + x/s;
  13. s := 0.5 * (s + x/s);
  14. IF ODD(e) THEN s := c3*s END ;
  15. PACK(s, e DIV 2)
  16. ELSE s := 0.0
  17. END ;
  18. RETURN s
  19. END sqrt;
  20. PROCEDURE exp*(x: REAL): REAL;
  21. CONST
  22. c1 = 1.4426951; (*1/ln(2) *)
  23. p0 = 1.513864173E3;
  24. p1= 2.020170000E1;
  25. p2 = 2.309432127E-2;
  26. q0 = 4.368088670E3;
  27. q1 = 2.331782320E2;
  28. VAR n: INTEGER; p, y, yy: REAL;
  29. BEGIN y := c1*x;
  30. n := FLOOR(y + 0.5); y := y - FLT(n);
  31. yy := y*y;
  32. p := ((p2*yy + p1)*yy + p0)*y;
  33. p := p/((yy + q1)*yy + q0 - p) + 0.5;
  34. PACK(p, n+1); RETURN p
  35. END exp;
  36. PROCEDURE ln*(x: REAL): REAL;
  37. CONST c1 = 0.70710680; (* 1/sqrt(2) *)
  38. c2 = 0.69314720; (* ln(2) *)
  39. p0 = -9.01746917E1;
  40. p1 = 9.34639006E1;
  41. p2 = -1.83278704E1;
  42. q0 = -4.50873458E1;
  43. q1 = 6.76106560E1;
  44. q2 = -2.07334879E1;
  45. VAR e: INTEGER; xx, y: REAL;
  46. BEGIN ASSERT(x > 0.0); UNPK(x, e);
  47. IF x < c1 THEN x := x*2.0; e := e-1 END ;
  48. x := (x-1.0)/(x+1.0);
  49. xx := x;
  50. y := c2*FLT(e) + x*((p2*xx + p1)*xx + p0) / (((xx + q2)*xx + q1)*xx + q0);
  51. RETURN y
  52. END ln;
  53. PROCEDURE sin*(x: REAL): REAL;
  54. CONST
  55. c1 = 6.3661977E-1; (*2/pi*)
  56. p0 = 7.8539816E-1;
  57. p1 = -8.0745512E-2;
  58. p2 = 2.4903946E-3;
  59. p3 = -3.6576204E-5;
  60. p4 = 3.1336162E-7;
  61. p5 = -1.7571493E-9;
  62. p6 = 6.8771004E-12;
  63. q0 = 9.9999999E-1;
  64. q1 = -3.0842514E-1;
  65. q2 = 1.5854344E-2;
  66. q3 = -3.2599189E-4;
  67. q4 = 3.5908591E-6;
  68. q5 = -2.4609457E-8;
  69. q6 = 1.1363813E-10;
  70. VAR n: INTEGER; y, yy, f: REAL;
  71. BEGIN y := c1*x;
  72. IF y >= 0.0 THEN n := FLOOR(y + 0.5) ELSE n := FLOOR(y - 0.5) END ;
  73. y := (y - FLT(n)) * 2.0; yy := y*y;
  74. IF ODD(n) THEN f := (((((q6*yy + q5)*yy + q4)*yy + q3)*yy + q2)*yy + q1)*yy + q0
  75. ELSE f := ((((((p6*yy + p5)*yy + p4)*yy + p3)*yy + p2)*yy + p1)*yy + p0)*y
  76. END ;
  77. IF ODD(n DIV 2) THEN f := -f END ;
  78. RETURN f
  79. END sin;
  80. PROCEDURE cos*(x: REAL): REAL;
  81. CONST
  82. c1 = 6.3661977E-1; (*2/pi*)
  83. p0 = 7.8539816E-1;
  84. p1 = -8.0745512E-2;
  85. p2 = 2.4903946E-3;
  86. p3 = -3.6576204E-5;
  87. p4 = 3.1336162E-7;
  88. p5 = -1.7571493E-9;
  89. p6 = 6.8771004E-12;
  90. q0 = 9.9999999E-1;
  91. q1 = -3.0842514E-1;
  92. q2 = 1.5854344E-2;
  93. q3 = -3.2599189E-4;
  94. q4 = 3.5908591E-6;
  95. q5 = -2.4609457E-8;
  96. q6 = 1.1363813E-10;
  97. VAR n: INTEGER; y, yy, f: REAL;
  98. BEGIN y := c1*x;
  99. IF y >= 0.0 THEN n := FLOOR(y + 0.5) ELSE n := FLOOR(y - 0.5) END ;
  100. y := (y - FLT(n)) * 2.0; yy := y*y;
  101. IF ~ODD(n) THEN f := (((((q6*yy + q5)*yy + q4)*yy + q3)*yy + q2)*yy + q1)*yy + q0
  102. ELSE f := ((((((p6*yy + p5)*yy + p4)*yy + p3)*yy + p2)*yy + p1)*yy + p0)*y
  103. END ;
  104. IF ODD((n+1) DIV 2) THEN f := -f END ;
  105. RETURN f
  106. END cos;
  107. END Math.