Math.txt 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532
  1. MODULE Math;
  2. (* THIS IS TEXT COPY OF BlackBox 1.6-rc6 System/Mod/Math.odc *)
  3. (* DO NOT EDIT *)
  4. IMPORT SYSTEM;
  5. VAR eps, e: REAL;
  6. (* code procedures for 80387 math coprocessor *)
  7. PROCEDURE [code] FLD (x: REAL);
  8. PROCEDURE [code] TOP (): REAL;
  9. PROCEDURE [code] FSW (): INTEGER 0DFH, 0E0H;
  10. PROCEDURE [code] FSWs (): SET 0DFH, 0E0H;
  11. PROCEDURE [code] ST0 (): REAL 0D9H, 0C0H;
  12. PROCEDURE [code] ST1 (): REAL 0D9H, 0C1H;
  13. PROCEDURE [code] FXCH 0D9H, 0C9H;
  14. PROCEDURE [code] FLDst0 0D9H, 0C0H; (* doublicate st[0] *)
  15. PROCEDURE [code] FSTPst0 0DDH, 0D8H; (* remove st[0] *)
  16. PROCEDURE [code] FSTPst1 0DDH, 0D9H; (* remove st[1] *)
  17. PROCEDURE [code] FSTPDe 0DBH, 05DH, 0F4H; (* FSTPD -12[FP] *) (* COMPILER DEPENDENT *)
  18. PROCEDURE [code] WAIT 09BH;
  19. PROCEDURE [code] FNOP 0D9H, 0D0H;
  20. PROCEDURE [code] FLD0 0D9H, 0EEH;
  21. PROCEDURE [code] FLD1 0D9H, 0E8H;
  22. PROCEDURE [code] FLDPI 0D9H, 0EBH;
  23. PROCEDURE [code] FLDLN2 0D9H, 0EDH;
  24. PROCEDURE [code] FLDLG2 0D9H, 0ECH;
  25. PROCEDURE [code] FLDL2E 0D9H, 0EAH;
  26. PROCEDURE [code] FADD 0DEH, 0C1H;
  27. PROCEDURE [code] FADDst0 0D8H, 0C0H;
  28. PROCEDURE [code] FSUB 0DEH, 0E9H;
  29. PROCEDURE [code] FSUBn 0DCH, 0E9H; (* no pop *)
  30. PROCEDURE [code] FSUBR 0DEH, 0E1H;
  31. PROCEDURE [code] FSUBst1 0D8H, 0E1H;
  32. PROCEDURE [code] FMUL 0DEH, 0C9H;
  33. PROCEDURE [code] FMULst0 0D8H, 0C8H;
  34. PROCEDURE [code] FMULst1st0 0DCH, 0C9H;
  35. PROCEDURE [code] FDIV 0DEH, 0F9H;
  36. PROCEDURE [code] FDIVR 0DEH, 0F1H;
  37. PROCEDURE [code] FDIVRst1 0D8H, 0F9H;
  38. PROCEDURE [code] FCHS 0D9H, 0E0H;
  39. PROCEDURE [code] FCOM 0D8H, 0D1H;
  40. PROCEDURE [code] FSWax 0DFH, 0E0H;
  41. PROCEDURE [code] SAHF 09EH;
  42. PROCEDURE [code] JBE4 076H, 004H;
  43. PROCEDURE [code] JAE4 073H, 004H;
  44. PROCEDURE [code] FRNDINT 0D9H, 0FCH;
  45. PROCEDURE [code] FSCALE 0D9H, 0FDH; (* st[0] * 2^FLOOR(st[1]) *)
  46. PROCEDURE [code] FXTRACT 0D9H, 0F4H; (* exp -> st[1]; mant -> st[0] *)
  47. PROCEDURE [code] FXAM 0D9H, 0E5H;
  48. PROCEDURE [code] FSQRT 0D9H, 0FAH; (* st[0] >= 0 *)
  49. PROCEDURE [code] FSIN 0D9H, 0FEH; (* |st[0]| < 2^63 *)
  50. PROCEDURE [code] FCOS 0D9H, 0FFH; (* |st[0]| < 2^63 *)
  51. PROCEDURE [code] FTAN 0D9H, 0F2H; (* |st[0]| < 2^63 *)
  52. PROCEDURE [code] FATAN 0D9H, 0F3H; (* atan2(st[1], st[0]) *)
  53. PROCEDURE [code] FYL2X 0D9H, 0F1H; (* st[1] * log2(st[0]), st[0] > 0 *)
  54. PROCEDURE [code] FYL2XP1 0D9H, 0F9H; (* st[1] * log2(1 + st[0]), |st[0]| < 1-sqrt(2)/2 *)
  55. PROCEDURE [code] F2XM1 0D9H, 0F0H; (* 2^st[0] - 1, |st[0]| <= 1 *)
  56. PROCEDURE IsNan (x: REAL): BOOLEAN;
  57. BEGIN
  58. FLD(x); FXAM; FSTPst0; WAIT; RETURN FSWs() * {8, 10} = {8}
  59. END IsNan;
  60. (* sin, cos, tan argument reduction *)
  61. PROCEDURE Reduce;
  62. BEGIN
  63. FXAM; WAIT;
  64. IF ~(8 IN FSWs()) & (ABS(ST0()) > 1.0E18) THEN
  65. (* to be completed *)
  66. FSTPst0; FLD0
  67. END;
  68. END Reduce;
  69. (** REAL precision **)
  70. PROCEDURE Pi* (): REAL;
  71. BEGIN
  72. FLDPI; RETURN TOP()
  73. END Pi;
  74. PROCEDURE Eps* (): REAL;
  75. BEGIN
  76. RETURN eps
  77. END Eps;
  78. PROCEDURE Sqrt* (x: REAL): REAL;
  79. BEGIN
  80. (* 20, argument of Sqrt must not be negative *)
  81. FLD(x); FSQRT; WAIT; RETURN TOP()
  82. END Sqrt;
  83. PROCEDURE Exp* (x: REAL): REAL;
  84. BEGIN
  85. (* 2 ^ (x * 1/ln(2)) *)
  86. FLD(x); FLDL2E; FMUL;
  87. IF ABS(ST0()) = INF THEN FLD1
  88. ELSE FLDst0; FRNDINT; FXCH; FSUBst1; FNOP; F2XM1; FLD1; FADD
  89. END;
  90. FSCALE; FSTPst1; RETURN TOP()
  91. END Exp;
  92. PROCEDURE Ln* (x: REAL): REAL;
  93. BEGIN
  94. (* 20, argument of Ln must not be negative *)
  95. (* ln(2) * ld(x) *)
  96. FLDLN2; FLD(x); FYL2X; WAIT; RETURN TOP()
  97. END Ln;
  98. PROCEDURE Log* (x: REAL): REAL;
  99. BEGIN
  100. (* 20, argument of Log must not be negative *)
  101. (* log(2) * ld(x) *)
  102. FLDLG2; FLD(x); FYL2X; WAIT; RETURN TOP()
  103. END Log;
  104. PROCEDURE Power* (x, y: REAL): REAL;
  105. BEGIN
  106. ASSERT(x >= 0, 20);
  107. ASSERT((x # 0.0) OR (y # 0.0), 21);
  108. ASSERT((x # INF) OR (y # 0.0), 22);
  109. ASSERT((x # 1.0) OR (ABS(y) # INF), 23);
  110. (* 2 ^ (y * ld(x)) *)
  111. FLD(y); FLD(x); FYL2X;
  112. IF ABS(ST0()) = INF THEN FLD1
  113. ELSE FLDst0; FRNDINT; FXCH; FSUBst1; FNOP; F2XM1; FLD1; FADD
  114. END;
  115. FSCALE; FSTPst1; WAIT; RETURN TOP()
  116. END Power;
  117. PROCEDURE IntPower* (x: REAL; n: INTEGER): REAL;
  118. BEGIN
  119. FLD1; FLD(x);
  120. IF n = MIN(INTEGER) THEN RETURN IntPower(x, n + 1) / x END;
  121. IF n <= 0 THEN FDIVRst1; (* 1 / x *) n := -n END;
  122. WHILE n > 0 DO
  123. IF ODD(n) THEN FMULst1st0; (* y := y * x *) DEC(n)
  124. ELSE FMULst0; (* x := x * x *) n := n DIV 2
  125. END
  126. END;
  127. FSTPst0; RETURN TOP()
  128. END IntPower;
  129. PROCEDURE Sin* (x: REAL): REAL;
  130. BEGIN
  131. (* 20, ABS(x) # INF *)
  132. FLD(x); Reduce; FSIN; WAIT; RETURN TOP()
  133. END Sin;
  134. PROCEDURE Cos* (x: REAL): REAL;
  135. BEGIN
  136. (* 20, ABS(x) # INF *)
  137. FLD(x); Reduce; FCOS; WAIT; RETURN TOP()
  138. END Cos;
  139. PROCEDURE Tan* (x: REAL): REAL;
  140. BEGIN
  141. (* 20, ABS(x) # INF *)
  142. FLD(x); Reduce; FTAN; FSTPst0; WAIT; RETURN TOP()
  143. END Tan;
  144. PROCEDURE ArcSin* (x: REAL): REAL;
  145. BEGIN
  146. (* 20, -1.0 <= x <= 1.0 *)
  147. (* atan2(x, sqrt(1 - x*x)) *)
  148. FLD(x); FLDst0; FMULst0; FLD1; FSUBR; FSQRT; FNOP; FATAN; WAIT; RETURN TOP()
  149. END ArcSin;
  150. PROCEDURE ArcCos* (x: REAL): REAL;
  151. BEGIN
  152. (* 20, -1.0 <= x <= 1.0 *)
  153. (* atan2(sqrt(1 - x*x), x) *)
  154. FLD(x); FMULst0; FLD1; FSUBR; FSQRT; FLD(x); FATAN; WAIT; RETURN TOP()
  155. END ArcCos;
  156. PROCEDURE ArcTan* (x: REAL): REAL;
  157. BEGIN
  158. (* atan2(x, 1) *)
  159. FLD(x); FLD1; FATAN; RETURN TOP()
  160. END ArcTan;
  161. PROCEDURE ArcTan2* (y, x: REAL): REAL;
  162. BEGIN
  163. ASSERT((y # 0) OR (x # 0), 20);
  164. ASSERT((ABS(y) # INF) OR (ABS(x) # INF), 21);
  165. FLD(y); FLD(x); FATAN; WAIT; RETURN TOP()
  166. END ArcTan2;
  167. PROCEDURE Sinh* (x: REAL): REAL;
  168. BEGIN
  169. (* IF IsNan(x) THEN RETURN x END; *)
  170. (* abs(x) * 1/ln(2) *)
  171. FLD(ABS(x)); FLDL2E; FMUL;
  172. IF ST0() < 0.5 THEN
  173. (* (2^z - 1) + (2^z - 1) / ((2^z - 1) + 1) *)
  174. F2XM1; FLDst0; FLDst0; FLD1; FADD; FDIV; FADD
  175. ELSIF ST0() # INF THEN
  176. (* 2^z - 1 / 2^z *)
  177. FLDst0; FRNDINT; FXCH; FSUBst1; FNOP; F2XM1; FLD1; FADD; FSCALE;
  178. FSTPst1; FLDst0; FLD1; FDIVR; FSUB
  179. END;
  180. IF x < 0 THEN FCHS END;
  181. RETURN TOP() * 0.5
  182. END Sinh;
  183. PROCEDURE Cosh* (x: REAL): REAL;
  184. BEGIN
  185. (* IF IsNan(x) THEN RETURN x END; *)
  186. (* 2^(abs(x) * 1/ln(2)) *)
  187. FLD(ABS(x));
  188. IF ST0() # INF THEN
  189. FLDL2E; FMUL; FLDst0; FRNDINT; FXCH; FSUBst1; FNOP; F2XM1; FLD1; FADD; FSCALE;
  190. FSTPst1;
  191. (* z + 1/z *)
  192. FLDst0; FLD1; FDIVR; FADD
  193. END;
  194. RETURN TOP() * 0.5
  195. END Cosh;
  196. PROCEDURE Tanh* (x: REAL): REAL;
  197. BEGIN
  198. (* IF IsNan(x) THEN RETURN x END; *)
  199. (* abs(x) * 1/ln(2) * 2 *)
  200. FLD(ABS(x)); FLDL2E; FMUL; FADDst0;
  201. IF ST0() < 0.5 THEN
  202. (* (2^z - 1) / (2^z + 1) *)
  203. F2XM1; FLDst0; FLD(2); FADD; FDIV
  204. ELSIF ST0() < 65 THEN
  205. (* 1 - 2 / (2^z + 1) *)
  206. FLDst0; FRNDINT; FXCH; FSUBst1; FNOP; F2XM1; FLD1; FADD; FSCALE;
  207. FSTPst1; FLD1; FADD; FLD(2); FDIVR; FLD1; FSUBR
  208. ELSE
  209. FSTPst0; FLD1
  210. END;
  211. IF x < 0 THEN FCHS END;
  212. RETURN TOP()
  213. END Tanh;
  214. PROCEDURE ArcSinh* (x: REAL): REAL;
  215. BEGIN
  216. (* IF IsNan(x) THEN RETURN x END; *)
  217. (* x*x *)
  218. FLDLN2; FLD(ABS(x)); FLDst0; FMULst0;
  219. IF ST0() < 0.067 THEN
  220. (* ln(2) * ld(1 + x*x / (sqrt(x*x + 1) + 1) + x) *)
  221. FLDst0; FLD1; FADD; FSQRT; FLD1; FADD; FDIV; FADD; FYL2XP1
  222. ELSE
  223. (* ln(2) * ld(x + sqrt(x*x + 1)) *)
  224. FLD1; FADD; FSQRT; FADD; FYL2X
  225. END;
  226. IF x < 0 THEN FCHS END;
  227. RETURN TOP()
  228. END ArcSinh;
  229. PROCEDURE ArcCosh* (x: REAL): REAL;
  230. BEGIN
  231. (* 20, x >= 1.0 *)
  232. (* IF IsNan(x) THEN RETURN x END; *)
  233. (* ln(2) * ld(x + sqrt(x*x - 1)) *)
  234. FLDLN2; FLD(x); FLDst0; FMULst0; FLD1; FSUB; FSQRT; FADD; FYL2X; WAIT; RETURN TOP()
  235. END ArcCosh;
  236. PROCEDURE ArcTanh* (x: REAL): REAL;
  237. BEGIN
  238. (* 20, -1.0 <= x <= 1.0 *)
  239. (* IF IsNan(x) THEN RETURN x END; *)
  240. (* |x| *)
  241. FLDLN2; FLD(ABS(x));
  242. IF ST0() < 0.12 THEN
  243. (* ln(2) * ld(1 + 2*x / (1 - x)) *)
  244. FLDst0; FLD1; FSUBR; FDIV; FADDst0; FYL2XP1
  245. ELSE
  246. (* ln(2) * ld((1 + x) / (1 - x)) *)
  247. FLDst0; FLD1; FADD; FXCH; FLD1; FSUBR; FDIV; FNOP; FYL2X
  248. END;
  249. IF x < 0 THEN FCHS END;
  250. WAIT;
  251. RETURN TOP() * 0.5
  252. END ArcTanh;
  253. PROCEDURE Floor* (x: REAL): REAL;
  254. BEGIN
  255. FLD(x); FLDst0; FRNDINT; FCOM; FSWax; FSTPst1; SAHF; JBE4; FLD1; FSUB; RETURN TOP()
  256. END Floor;
  257. PROCEDURE Ceiling* (x: REAL): REAL;
  258. BEGIN
  259. FLD(x); FLDst0; FRNDINT; FCOM; FSWax; FSTPst1; SAHF; JAE4; FLD1; FADD; RETURN TOP()
  260. END Ceiling;
  261. PROCEDURE Round* (x: REAL): REAL;
  262. BEGIN
  263. FLD(x);
  264. IF ABS(ST0()) = INF THEN RETURN TOP() END;
  265. FLDst0; FRNDINT; FSUBn; FXCH;
  266. IF TOP() = 0.5 THEN FLD1; FADD END;
  267. RETURN TOP()
  268. END Round;
  269. PROCEDURE Trunc* (x: REAL): REAL;
  270. BEGIN
  271. FLD(x); FLDst0; FRNDINT;
  272. IF ST1() >= 0 THEN
  273. FCOM; FSWax; FSTPst1; SAHF; JBE4; FLD1; FSUB
  274. ELSE
  275. FCOM; FSWax; FSTPst1; SAHF; JAE4; FLD1; FADD
  276. END;
  277. RETURN TOP()
  278. END Trunc;
  279. PROCEDURE Frac* (x: REAL): REAL;
  280. BEGIN
  281. (* 20, x # INF & x # -INF *)
  282. FLD(x); FLDst0; FRNDINT;
  283. IF ST1() >= 0 THEN
  284. FCOM; FSWax; SAHF; JBE4; FLD1; FSUB
  285. ELSE
  286. FCOM; FSWax; SAHF; JAE4; FLD1; FADD
  287. END;
  288. FSUB; WAIT; RETURN TOP()
  289. END Frac;
  290. PROCEDURE Sign* (x: REAL): REAL;
  291. BEGIN
  292. FLD(x); FXAM; WAIT;
  293. CASE FSW() DIV 256 MOD 8 OF
  294. | 0, 2: FSTPst0; RETURN 0.0
  295. | 1, 4, 5: FSTPst0; RETURN 1.0
  296. | 3, 6, 7: FSTPst0; RETURN -1.0
  297. END
  298. END Sign;
  299. PROCEDURE Mantissa* (x: REAL): REAL;
  300. BEGIN
  301. FLD(x); FXAM; WAIT;
  302. CASE FSW() DIV 256 MOD 8 OF
  303. | 4, 6: FXTRACT; FSTPst1; RETURN TOP()
  304. | 0, 2: FSTPst0; RETURN 0.0 (* zero *)
  305. | 5: FSTPst0; RETURN 1.0 (* inf *)
  306. | 7: FSTPst0; RETURN -1.0 (* -inf *)
  307. | 1: FSTPst0; RETURN 1.5 (* nan *)
  308. | 3: FSTPst0; RETURN -1.5 (* -nan *)
  309. END
  310. END Mantissa;
  311. PROCEDURE Exponent* (x: REAL): INTEGER; (* COMPILER DEPENDENT *)
  312. VAR e: INTEGER; (* e is set by FSTPDe! *)
  313. BEGIN
  314. FLD(x); FXAM; WAIT;
  315. CASE FSW() DIV 256 MOD 8 OF
  316. | 4, 6: FXTRACT; FSTPst0; FSTPDe; WAIT; RETURN e
  317. | 0, 2: FSTPst0; RETURN 0 (* zero *)
  318. | 1, 3, 5, 7: FSTPst0; RETURN MAX(INTEGER) (* inf or nan*)
  319. END
  320. END Exponent;
  321. PROCEDURE Real* (m: REAL; e: INTEGER): REAL;
  322. VAR s: SET;
  323. BEGIN
  324. IF (m = 0) THEN RETURN 0.0 END;
  325. ASSERT(~IsNan(m) & (1 <= ABS(m)) & (ABS(m) < 2), 20);
  326. IF e = MAX(INTEGER) THEN
  327. SYSTEM.GET(SYSTEM.ADR(m) + 4, s);
  328. SYSTEM.PUT(SYSTEM.ADR(m) + 4, s + {20..30});
  329. RETURN m
  330. ELSE
  331. FLD(e); FLD(m); FSCALE; FSTPst1; RETURN TOP()
  332. END
  333. END Real;
  334. BEGIN
  335. eps := 1.0E+0; e := 2.0E+0;
  336. WHILE e > 1.0E+0 DO eps := eps/2.0E+0; e := 1.0E+0 + eps END; eps := 2.0E+0 * eps;
  337. END Math.
  338. PROCEDURE Log* (x: REAL): REAL;
  339. BEGIN
  340. RETURN Ln(x)/ln10
  341. END Log;
  342. PROCEDURE Power* (x, y: REAL): REAL;
  343. BEGIN
  344. RETURN Exp(y * Ln(x))
  345. END Power;
  346. PROCEDURE IntPower* (x: REAL; n: LONGINT): REAL;
  347. VAR y: REAL;
  348. BEGIN y := 1.0E+0;
  349. IF n < 0 THEN x := 1.0E+0/x; n := -n END;
  350. WHILE n > 0 DO
  351. IF ODD(n) THEN y := y*x; DEC(n)
  352. ELSE x := x * x; n := n DIV 2
  353. END
  354. END;
  355. RETURN y
  356. END IntPower;
  357. PROCEDURE Tan* (x: REAL): REAL;
  358. BEGIN
  359. RETURN Sin(x)/Cos(x)
  360. END Tan;
  361. PROCEDURE ArcSin* (x: REAL): REAL;
  362. BEGIN
  363. RETURN 2.0E+0 * ArcTan(x/(1.0E+0 + Sqrt(1.0E+0 - x*x)))
  364. END ArcSin;
  365. PROCEDURE ArcCos* (x: REAL): REAL;
  366. BEGIN (* pi/2 - arcsin(x) *)
  367. RETURN Pi()/2.0E+0 - 2.0E+0 * ArcTan(x/(1.0E+0 + Sqrt(1.0E+0 - x*x)))
  368. (*
  369. IF x = -1 THEN RETURN Pi()
  370. ELSE RETURN 2 * ArcTan(Sqrt((1 - x) / (1 + x)))
  371. END
  372. *) END ArcCos;
  373. PROCEDURE ArcTan2* (y, x: REAL): REAL;
  374. BEGIN
  375. IF x = 0.0 THEN
  376. RETURN Sign(y) * Pi() / 2.0
  377. ELSIF y = 0.0 THEN
  378. RETURN (1.0 - Sign(x)) * Pi() / 2.0
  379. ELSE
  380. RETURN ArcTan(y/x) + (1.0 - Sign(x)) * Sign(y) * Pi() / 2.0
  381. END
  382. END ArcTan2;
  383. PROCEDURE Sinh* (x: REAL): REAL;
  384. BEGIN
  385. IF ABS(x) < -lneps THEN RETURN (Exp(x)-Exp(-x))/2.0E+0
  386. ELSE RETURN Sign(x)*Exp(ABS(x))/2.0E+0
  387. END
  388. END Sinh;
  389. PROCEDURE Cosh* (x: REAL): REAL;
  390. BEGIN
  391. IF ABS(x) < -lneps THEN RETURN (Exp(x)+Exp(-x))/2.0E+0
  392. ELSE RETURN Exp(ABS(x))/2.0E+0
  393. END
  394. END Cosh;
  395. PROCEDURE Tanh* (x: REAL): REAL;
  396. VAR e1, e2: REAL;
  397. BEGIN
  398. IF ABS(x) < -lneps THEN
  399. e1 := Exp(x); e2 := 1.0E+0/e1;
  400. RETURN (e1-e2)/(e1+e2)
  401. ELSE
  402. RETURN Sign(x)
  403. END
  404. END Tanh;
  405. PROCEDURE ArcSinh* (x: REAL): REAL;
  406. BEGIN
  407. IF x >= 0.0E+0 THEN RETURN Ln(x + Sqrt(x*x + 1.0E+0))
  408. ELSE RETURN - Ln(-x + Sqrt(x*x + 1.0E+0))
  409. END
  410. END ArcSinh;
  411. PROCEDURE ArcCosh* (x: REAL): REAL;
  412. BEGIN
  413. RETURN Ln(x + Sqrt(x*x - 1.0E+0))
  414. END ArcCosh;
  415. PROCEDURE ArcTanh* (x: REAL): REAL;
  416. BEGIN
  417. RETURN Ln((1.0E+0 + x)/(1.0E+0 - x))/2.0E+0
  418. (* Variants:
  419. (Ln(1+x)-Ln(1-x))/2.0E+0
  420. -Ln((1-x)/Sqrt(1-x*x))
  421. arcsinh(x/sqrt(1-x*x))
  422. *)
  423. END ArcTanh;
  424. PROCEDURE Floor* (x: REAL): REAL;
  425. BEGIN
  426. IF ABS(x) >= 1.0E16 THEN RETURN x
  427. ELSE RETURN ENTIER(x)
  428. END
  429. END Floor;
  430. PROCEDURE Ceiling* (x: REAL): REAL;
  431. BEGIN
  432. IF ABS(x) >= 1.0E16 THEN RETURN x
  433. ELSE RETURN -ENTIER(-x)
  434. END
  435. END Ceiling;
  436. PROCEDURE Round* (x: REAL): REAL;
  437. BEGIN
  438. IF ABS(x) >= 1.0E16 THEN RETURN x
  439. ELSE RETURN ENTIER(x + 0.5)
  440. END
  441. END Round;
  442. PROCEDURE Trunc* (x: REAL): REAL;
  443. BEGIN
  444. IF ABS(x) >= 1.0E16 THEN RETURN x
  445. ELSIF x >= 0 THEN RETURN ENTIER(x)
  446. ELSE RETURN -ENTIER(-x)
  447. END
  448. END Trunc;
  449. PROCEDURE Frac* (x: REAL): REAL;
  450. BEGIN
  451. IF ABS(x) >= 1.0E16 THEN RETURN 0.0
  452. ELSIF x >= 0 THEN RETURN x - ENTIER(x)
  453. ELSE RETURN x + ENTIER(-x)
  454. END
  455. END Frac;