math.js 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309
  1. var $builtinmodule = function (name) {
  2. var mod = {};
  3. mod.pi = new Sk.builtin.float_(Math.PI);
  4. mod.e = new Sk.builtin.float_(Math.E);
  5. mod.fabs = new Sk.builtin.func(function (x) {
  6. Sk.builtin.pyCheckArgs("fabs", arguments, 1, 1);
  7. Sk.builtin.pyCheckType("x", "number", Sk.builtin.checkNumber(x));
  8. return new Sk.builtin.float_(Math.abs(Sk.builtin.asnum$(x)));
  9. });
  10. mod.asin = new Sk.builtin.func(function (rad) {
  11. Sk.builtin.pyCheckArgs("asin", arguments, 1, 1);
  12. Sk.builtin.pyCheckType("rad", "number", Sk.builtin.checkNumber(rad));
  13. return new Sk.builtin.float_(Math.asin(Sk.builtin.asnum$(rad)));
  14. });
  15. mod.acos = new Sk.builtin.func(function (rad) {
  16. Sk.builtin.pyCheckArgs("acos", arguments, 1, 1);
  17. Sk.builtin.pyCheckType("rad", "number", Sk.builtin.checkNumber(rad));
  18. return new Sk.builtin.float_(Math.acos(Sk.builtin.asnum$(rad)));
  19. });
  20. mod.atan = new Sk.builtin.func(function (rad) {
  21. Sk.builtin.pyCheckArgs("atan", arguments, 1, 1);
  22. Sk.builtin.pyCheckType("rad", "number", Sk.builtin.checkNumber(rad));
  23. return new Sk.builtin.float_(Math.atan(Sk.builtin.asnum$(rad)));
  24. });
  25. mod.atan2 = new Sk.builtin.func(function (y, x) {
  26. Sk.builtin.pyCheckArgs("atan2", arguments, 2, 2);
  27. Sk.builtin.pyCheckType("y", "number", Sk.builtin.checkNumber(y));
  28. Sk.builtin.pyCheckType("x", "number", Sk.builtin.checkNumber(x));
  29. return new Sk.builtin.float_(Math.atan2(Sk.builtin.asnum$(y), Sk.builtin.asnum$(x)));
  30. });
  31. mod.sin = new Sk.builtin.func(function (rad) {
  32. Sk.builtin.pyCheckArgs("sin", arguments, 1, 1);
  33. Sk.builtin.pyCheckType("rad", "number", Sk.builtin.checkNumber(rad));
  34. return new Sk.builtin.float_(Math.sin(Sk.builtin.asnum$(rad)));
  35. });
  36. mod.cos = new Sk.builtin.func(function (rad) {
  37. Sk.builtin.pyCheckArgs("cos", arguments, 1, 1);
  38. Sk.builtin.pyCheckType("rad", "number", Sk.builtin.checkNumber(rad));
  39. return new Sk.builtin.float_(Math.cos(Sk.builtin.asnum$(rad)));
  40. });
  41. mod.tan = new Sk.builtin.func(function (rad) {
  42. Sk.builtin.pyCheckArgs("tan", arguments, 1, 1);
  43. Sk.builtin.pyCheckType("rad", "number", Sk.builtin.checkNumber(rad));
  44. return new Sk.builtin.float_(Math.tan(Sk.builtin.asnum$(rad)));
  45. });
  46. mod.asinh = new Sk.builtin.func(function (x) {
  47. Sk.builtin.pyCheckArgs("asinh", arguments, 1, 1);
  48. Sk.builtin.pyCheckType("x", "number", Sk.builtin.checkNumber(x));
  49. x = Sk.builtin.asnum$(x);
  50. var L = x + Math.sqrt(x * x + 1);
  51. return new Sk.builtin.float_(Math.log(L));
  52. });
  53. mod.acosh = new Sk.builtin.func(function (x) {
  54. Sk.builtin.pyCheckArgs("acosh", arguments, 1, 1);
  55. Sk.builtin.pyCheckType("x", "number", Sk.builtin.checkNumber(x));
  56. x = Sk.builtin.asnum$(x);
  57. var L = x + Math.sqrt(x * x - 1);
  58. return new Sk.builtin.float_(Math.log(L));
  59. });
  60. mod.atanh = new Sk.builtin.func(function (x) {
  61. Sk.builtin.pyCheckArgs("atanh", arguments, 1, 1);
  62. Sk.builtin.pyCheckType("x", "number", Sk.builtin.checkNumber(x));
  63. x = Sk.builtin.asnum$(x);
  64. var L = (1 + x) / (1 - x);
  65. return new Sk.builtin.float_(Math.log(L) / 2);
  66. });
  67. mod.sinh = new Sk.builtin.func(function (x) {
  68. Sk.builtin.pyCheckArgs("sinh", arguments, 1, 1);
  69. Sk.builtin.pyCheckType("x", "number", Sk.builtin.checkNumber(x));
  70. x = Sk.builtin.asnum$(x);
  71. var e = Math.E;
  72. var p = Math.pow(e, x);
  73. var n = 1 / p;
  74. var result = (p - n) / 2;
  75. return new Sk.builtin.float_(result);
  76. });
  77. mod.cosh = new Sk.builtin.func(function (x) {
  78. Sk.builtin.pyCheckArgs("cosh", arguments, 1, 1);
  79. Sk.builtin.pyCheckType("x", "number", Sk.builtin.checkNumber(x));
  80. x = Sk.builtin.asnum$(x);
  81. var e = Math.E;
  82. var p = Math.pow(e, x);
  83. var n = 1 / p;
  84. var result = (p + n) / 2;
  85. return new Sk.builtin.float_(result);
  86. });
  87. mod.tanh = new Sk.builtin.func(function (x) {
  88. Sk.builtin.pyCheckArgs("tanh", arguments, 1, 1);
  89. Sk.builtin.pyCheckType("x", "number", Sk.builtin.checkNumber(x));
  90. x = Sk.builtin.asnum$(x);
  91. var e = Math.E;
  92. var p = Math.pow(e, x);
  93. var n = 1 / p;
  94. var result = ((p - n) / 2) / ((p + n) / 2);
  95. return new Sk.builtin.float_(result);
  96. });
  97. mod.ceil = new Sk.builtin.func(function (x) {
  98. Sk.builtin.pyCheckArgs("ceil", arguments, 1, 1);
  99. Sk.builtin.pyCheckType("x", "number", Sk.builtin.checkNumber(x));
  100. return new Sk.builtin.float_(Math.ceil(Sk.builtin.asnum$(x)));
  101. });
  102. // returns y with the sign of x
  103. mod.copysign = new Sk.builtin.func(function (x, y) {
  104. Sk.builtin.pyCheckArgs("ceil", arguments, 2, 2);
  105. Sk.builtin.pyCheckType("x", "number", Sk.builtin.checkNumber(x));
  106. Sk.builtin.pyCheckType("y", "number", Sk.builtin.checkNumber(y));
  107. var _x = Sk.ffi.remapToJs(x);
  108. var _y = Sk.ffi.remapToJs(y);
  109. var res;
  110. var isNeg_x = _x < 0;
  111. var isNeg_y = _x < 0;
  112. // special case for floats with negative zero
  113. if(Sk.builtin.checkFloat(x)) {
  114. if(_x === 0) {
  115. isNeg_x = 1/_x === -Infinity ? true : false;
  116. }
  117. }
  118. if(Sk.builtin.checkFloat(y)) {
  119. if(_y === 0) {
  120. isNeg_y = 1/_y === -Infinity ? true : false;
  121. }
  122. }
  123. // if both signs are equal, just return _y
  124. if((isNeg_x && isNeg_y) || (!isNeg_x && !isNeg_y)) {
  125. res = _y;
  126. } else if((isNeg_x && !isNeg_y) || (!isNeg_x && isNeg_y)) {
  127. // if different, invert sign
  128. if(y === 0) {
  129. // special case for zero
  130. res = isNeg_x ? -0.0 : 0.0;
  131. } else {
  132. res = _y * -1;
  133. }
  134. }
  135. return new Sk.builtin.float_(res);
  136. });
  137. mod.floor = new Sk.builtin.func(function (x) {
  138. Sk.builtin.pyCheckArgs("floor", arguments, 1, 1);
  139. Sk.builtin.pyCheckType("x", "number", Sk.builtin.checkNumber(x));
  140. return new Sk.builtin.float_(Math.floor(Sk.builtin.asnum$(x)));
  141. });
  142. mod.sqrt = new Sk.builtin.func(function (x) {
  143. Sk.builtin.pyCheckArgs("sqrt", arguments, 1, 1);
  144. Sk.builtin.pyCheckType("x", "number", Sk.builtin.checkNumber(x));
  145. return new Sk.builtin.float_(Math.sqrt(Sk.builtin.asnum$(x)));
  146. });
  147. mod.trunc = new Sk.builtin.func(function (x) {
  148. Sk.builtin.pyCheckArgs("trunc", arguments, 1, 1);
  149. Sk.builtin.pyCheckType("x", "number", Sk.builtin.checkNumber(x));
  150. return new Sk.builtin.int_(Sk.builtin.asnum$(x) | 0);
  151. });
  152. mod.log = new Sk.builtin.func(function (x, base) {
  153. Sk.builtin.pyCheckArgs("log", arguments, 1, 2);
  154. Sk.builtin.pyCheckType("x", "number", Sk.builtin.checkNumber(x));
  155. if (base === undefined) {
  156. return new Sk.builtin.float_(Math.log(Sk.builtin.asnum$(x)));
  157. } else {
  158. Sk.builtin.pyCheckType("base", "number", Sk.builtin.checkNumber(base));
  159. var ret = Math.log(Sk.builtin.asnum$(x)) / Math.log(Sk.builtin.asnum$(base));
  160. return new Sk.builtin.float_(ret);
  161. }
  162. });
  163. mod.log10 = new Sk.builtin.func(function (x) {
  164. Sk.builtin.pyCheckArgs("log10", arguments, 1, 1);
  165. Sk.builtin.pyCheckType("x", "number", Sk.builtin.checkNumber(x));
  166. var ret = Math.log(Sk.builtin.asnum$(x)) / Math.log(10);
  167. return new Sk.builtin.float_(ret);
  168. });
  169. /* Return True if x is infinite, and False otherwise. */
  170. mod.isinf = new Sk.builtin.func(function(x) {
  171. Sk.builtin.pyCheckArgs("isinf", arguments, 1, 1);
  172. Sk.builtin.pyCheckType("x", "number", Sk.builtin.checkNumber(x));
  173. var _x = Sk.builtin.asnum$(x);
  174. if(isFinite(_x) && !isNaN(_x)) {
  175. return Sk.builtin.bool.false$;
  176. } else {
  177. return Sk.builtin.bool.true$
  178. }
  179. });
  180. /* Return True if x is a NaN (not a number), and False otherwise. */
  181. mod.isnan = new Sk.builtin.func(function(x) {
  182. Sk.builtin.pyCheckArgs("isnan", arguments, 1, 1);
  183. Sk.builtin.pyCheckType("x", "float", Sk.builtin.checkFloat(x));
  184. var _x = Sk.builtin.asnum$(x);
  185. if(isNaN(_x)) {
  186. return Sk.builtin.bool.true$;
  187. } else {
  188. return Sk.builtin.bool.false$;
  189. }
  190. });
  191. mod.exp = new Sk.builtin.func(function (x) {
  192. Sk.builtin.pyCheckArgs("exp", arguments, 1, 1);
  193. Sk.builtin.pyCheckType("x", "number", Sk.builtin.checkNumber(x));
  194. return new Sk.builtin.float_(Math.exp(Sk.builtin.asnum$(x)));
  195. });
  196. mod.pow = new Sk.builtin.func(function (x, y) {
  197. Sk.builtin.pyCheckArgs("pow", arguments, 2, 2);
  198. Sk.builtin.pyCheckType("x", "number", Sk.builtin.checkNumber(x));
  199. Sk.builtin.pyCheckType("y", "number", Sk.builtin.checkNumber(y));
  200. return new Sk.builtin.float_(Math.pow(Sk.builtin.asnum$(x), Sk.builtin.asnum$(y)));
  201. });
  202. mod.radians = new Sk.builtin.func(function (deg) {
  203. Sk.builtin.pyCheckArgs("radians", arguments, 1, 1);
  204. Sk.builtin.pyCheckType("deg", "number", Sk.builtin.checkNumber(deg));
  205. var ret = Math.PI / 180.0 * Sk.builtin.asnum$(deg);
  206. return new Sk.builtin.float_(ret);
  207. });
  208. mod.degrees = new Sk.builtin.func(function (rad) {
  209. Sk.builtin.pyCheckArgs("degrees", arguments, 1, 1);
  210. Sk.builtin.pyCheckType("rad", "number", Sk.builtin.checkNumber(rad));
  211. var ret = 180.0 / Math.PI * Sk.builtin.asnum$(rad);
  212. return new Sk.builtin.float_(ret);
  213. });
  214. mod.hypot = new Sk.builtin.func(function (x, y) {
  215. Sk.builtin.pyCheckArgs("hypot", arguments, 2, 2);
  216. Sk.builtin.pyCheckType("x", "number", Sk.builtin.checkNumber(x));
  217. Sk.builtin.pyCheckType("y", "number", Sk.builtin.checkNumber(y));
  218. x = Sk.builtin.asnum$(x);
  219. y = Sk.builtin.asnum$(y);
  220. return new Sk.builtin.float_(Math.sqrt((x * x) + (y * y)));
  221. });
  222. mod.factorial = new Sk.builtin.func(function (x) {
  223. Sk.builtin.pyCheckArgs("factorial", arguments, 1, 1);
  224. Sk.builtin.pyCheckType("x", "number", Sk.builtin.checkNumber(x));
  225. x = Math.floor(Sk.builtin.asnum$(x));
  226. var r = 1;
  227. for (var i = 2; i <= x; i++) {
  228. r *= i;
  229. }
  230. return new Sk.builtin.int_(r);
  231. });
  232. return mod;
  233. }