Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. (*
  2.     Copyright 2016 Anton Krotov
  3.  
  4.     This program is free software: you can redistribute it and/or modify
  5.     it under the terms of the GNU Lesser General Public License as published by
  6.     the Free Software Foundation, either version 3 of the License, or
  7.     (at your option) any later version.
  8.  
  9.     This program is distributed in the hope that it will be useful,
  10.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  11.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12.     GNU Lesser General Public License for more details.
  13.  
  14.     You should have received a copy of the GNU Lesser General Public License
  15.     along with this program.  If not, see <http://www.gnu.org/licenses/>.
  16. *)
  17.  
  18. MODULE Math;
  19.  
  20. IMPORT sys := SYSTEM;
  21.  
  22. CONST pi* = 3.141592653589793D+00;
  23.       e*  = 2.718281828459045D+00;
  24.  
  25. VAR Inf*, nInf*: LONGREAL;
  26.  
  27. PROCEDURE IsNan*(x: LONGREAL): BOOLEAN;
  28. VAR h, l: SET;
  29. BEGIN
  30.   sys.GET(sys.ADR(x), l);
  31.   sys.GET(sys.ADR(x) + 4, h);
  32.   RETURN (h * {20..30} = {20..30}) & ((h * {0..19} # {}) OR (l * {0..31} # {}))
  33. END IsNan;
  34.  
  35. PROCEDURE IsInf*(x: LONGREAL): BOOLEAN;
  36.   RETURN ABS(x) = sys.INF(LONGREAL)
  37. END IsInf;
  38.  
  39. PROCEDURE Max(A, B: LONGREAL): LONGREAL;
  40. VAR Res: LONGREAL;
  41. BEGIN
  42.   IF A > B THEN
  43.     Res := A
  44.   ELSE
  45.     Res := B
  46.   END
  47.   RETURN Res
  48. END Max;
  49.  
  50. PROCEDURE Min(A, B: LONGREAL): LONGREAL;
  51. VAR Res: LONGREAL;
  52. BEGIN
  53.   IF A < B THEN
  54.     Res := A
  55.   ELSE
  56.     Res := B
  57.   END
  58.   RETURN Res
  59. END Min;
  60.  
  61. PROCEDURE SameValue(A, B: LONGREAL): BOOLEAN;
  62. VAR Epsilon: LONGREAL; Res: BOOLEAN;
  63. BEGIN
  64.   Epsilon := Max(Min(ABS(A), ABS(B)) * 1.0D-12, 1.0D-12);
  65.   IF A > B THEN
  66.     Res := (A - B) <= Epsilon
  67.   ELSE
  68.     Res := (B - A) <= Epsilon
  69.   END
  70.   RETURN Res
  71. END SameValue;
  72.  
  73. PROCEDURE IsZero(x: LONGREAL): BOOLEAN;
  74.   RETURN ABS(x) <= 1.0D-12
  75. END IsZero;
  76.  
  77. PROCEDURE [stdcall] sqrt*(x: LONGREAL): LONGREAL;
  78. BEGIN
  79.   sys.CODE("DD4508D9FAC9C20800")
  80.   RETURN 0.0D0
  81. END sqrt;
  82.  
  83. PROCEDURE [stdcall] sin*(x: LONGREAL): LONGREAL;
  84. BEGIN
  85.   sys.CODE("DD4508D9FEC9C20800")
  86.   RETURN 0.0D0
  87. END sin;
  88.  
  89. PROCEDURE [stdcall] cos*(x: LONGREAL): LONGREAL;
  90. BEGIN
  91.   sys.CODE("DD4508D9FFC9C20800")
  92.   RETURN 0.0D0
  93. END cos;
  94.  
  95. PROCEDURE [stdcall] tan*(x: LONGREAL): LONGREAL;
  96. BEGIN
  97.   sys.CODE("DD4508D9F2DEC9C9C20800")
  98.   RETURN 0.0D0
  99. END tan;
  100.  
  101. PROCEDURE [stdcall] arctan2*(y, x: LONGREAL): LONGREAL;
  102. BEGIN
  103.   sys.CODE("DD4508DD4510D9F3C9C21000")
  104.   RETURN 0.0D0
  105. END arctan2;
  106.  
  107. PROCEDURE [stdcall] ln*(x: LONGREAL): LONGREAL;
  108. BEGIN
  109.   sys.CODE("D9EDDD4508D9F1C9C20800")
  110.   RETURN 0.0D0
  111. END ln;
  112.  
  113. PROCEDURE [stdcall] log*(base, x: LONGREAL): LONGREAL;
  114. BEGIN
  115.   sys.CODE("D9E8DD4510D9F1D9E8DD4508D9F1DEF9C9C21000")
  116.   RETURN 0.0D0
  117. END log;
  118.  
  119. PROCEDURE [stdcall] exp*(x: LONGREAL): LONGREAL;
  120. BEGIN
  121.   sys.CODE("DD4508D9EADEC9D9C0D9FCDCE9D9C9D9F0D9E8DEC1D9FDDDD9C9C20800")
  122.   RETURN 0.0D0
  123. END exp;
  124.  
  125. PROCEDURE [stdcall] round*(x: LONGREAL): LONGREAL;
  126. BEGIN
  127.   sys.CODE("DD4508D97DF4D97DF666814DF60003D96DF6D9FCD96DF4C9C20800")
  128.   RETURN 0.0D0
  129. END round;
  130.  
  131. PROCEDURE [stdcall] frac*(x: LONGREAL): LONGREAL;
  132. BEGIN
  133.   sys.CODE("50DD4508D9C0D93C24D97C240266814C2402000FD96C2402D9FCD92C24DEE9C9C20800")
  134.   RETURN 0.0D0
  135. END frac;
  136.  
  137. PROCEDURE arcsin*(x: LONGREAL): LONGREAL;
  138.   RETURN arctan2(x, sqrt(1.0D0 - x * x))
  139. END arcsin;
  140.  
  141. PROCEDURE arccos*(x: LONGREAL): LONGREAL;
  142.   RETURN arctan2(sqrt(1.0D0 - x * x), x)
  143. END arccos;
  144.  
  145. PROCEDURE arctan*(x: LONGREAL): LONGREAL;
  146.   RETURN arctan2(x, 1.0D0)
  147. END arctan;
  148.  
  149. PROCEDURE sinh*(x: LONGREAL): LONGREAL;
  150. VAR Res: LONGREAL;
  151. BEGIN
  152.   IF IsZero(x) THEN
  153.     Res := 0.0D0
  154.   ELSE
  155.     Res := (exp(x) - exp(-x)) / 2.0D0
  156.   END
  157.   RETURN Res
  158. END sinh;
  159.  
  160. PROCEDURE cosh*(x: LONGREAL): LONGREAL;
  161. VAR Res: LONGREAL;
  162. BEGIN
  163.   IF IsZero(x) THEN
  164.     Res := 1.0D0
  165.   ELSE
  166.     Res := (exp(x) + exp(-x)) / 2.0D0
  167.   END
  168.   RETURN Res
  169. END cosh;
  170.  
  171. PROCEDURE tanh*(x: LONGREAL): LONGREAL;
  172. VAR Res: LONGREAL;
  173. BEGIN
  174.   IF IsZero(x) THEN
  175.     Res := 0.0D0
  176.   ELSE
  177.     Res := sinh(x) / cosh(x)
  178.   END
  179.   RETURN Res
  180. END tanh;
  181.  
  182. PROCEDURE arcsinh*(x: LONGREAL): LONGREAL;
  183.   RETURN ln(x + sqrt((x * x) + 1.0D0))
  184. END arcsinh;
  185.  
  186. PROCEDURE arccosh*(x: LONGREAL): LONGREAL;
  187.   RETURN ln(x + sqrt((x - 1.0D0) / (x + 1.0D0)) * (x + 1.0D0))
  188. END arccosh;
  189.  
  190. PROCEDURE arctanh*(x: LONGREAL): LONGREAL;
  191. VAR Res: LONGREAL;
  192. BEGIN
  193.   IF SameValue(x, 1.0D0) THEN
  194.     Res := Inf
  195.   ELSIF SameValue(x, -1.0D0) THEN
  196.     Res := nInf
  197.   ELSE
  198.     Res := 0.5D0 * ln((1.0D0 + x) / (1.0D0 - x))
  199.   END
  200.   RETURN Res
  201. END arctanh;
  202.  
  203. PROCEDURE floor*(x: LONGREAL): LONGREAL;
  204. VAR f: LONGREAL;
  205. BEGIN
  206.   f := frac(x);
  207.   x := x - f;
  208.   IF f < 0.0D0 THEN
  209.     x := x - 1.0D0
  210.   END
  211.   RETURN x
  212. END floor;
  213.  
  214. PROCEDURE ceil*(x: LONGREAL): LONGREAL;
  215. VAR f: LONGREAL;
  216. BEGIN
  217.   f := frac(x);
  218.   x := x - f;
  219.   IF f > 0.0D0 THEN
  220.     x := x + 1.0D0
  221.   END
  222.   RETURN x
  223. END ceil;
  224.  
  225. PROCEDURE power*(base, exponent: LONGREAL): LONGREAL;
  226. VAR Res: LONGREAL;
  227. BEGIN
  228.   IF exponent = 0.0D0 THEN
  229.     Res := 1.0D0
  230.   ELSIF (base = 0.0D0) & (exponent > 0.0D0) THEN
  231.     Res := 0.0D0
  232.   ELSE
  233.     Res := exp(exponent * ln(base))
  234.   END
  235.   RETURN Res
  236. END power;
  237.  
  238. PROCEDURE sgn*(x: LONGREAL): INTEGER;
  239. VAR Res: INTEGER;
  240. BEGIN
  241.   IF x > 0.0D0 THEN
  242.     Res := 1
  243.   ELSIF x < 0.0D0 THEN
  244.     Res := -1
  245.   ELSE
  246.     Res := 0
  247.   END
  248.   RETURN Res
  249. END sgn;
  250.  
  251. BEGIN
  252.   Inf := sys.INF(LONGREAL);
  253.   nInf := -sys.INF(LONGREAL)
  254. END Math.