diff --git a/compiler/vmops.nim b/compiler/vmops.nim index a3d4d74dbe..661f71c443 100644 --- a/compiler/vmops.nim +++ b/compiler/vmops.nim @@ -11,7 +11,8 @@ #import vmdeps, vm from math import sqrt, ln, log10, log2, exp, round, arccos, arcsin, arctan, arctan2, cos, cosh, hypot, sinh, sin, tan, tanh, pow, trunc, - floor, ceil, `mod` + floor, ceil, `mod`, cbrt, arcsinh, arccosh, arctanh, erf, erfc, gamma, + lgamma from os import getEnv, existsEnv, dirExists, fileExists, putEnv, walkDir, getAppFilename from md5 import getMD5 @@ -147,6 +148,7 @@ proc registerAdditionalOps*(c: PCtx) = setResult a, c.config.projectPath.string wrap1f_math(sqrt) + wrap1f_math(cbrt) wrap1f_math(ln) wrap1f_math(log10) wrap1f_math(log2) @@ -155,6 +157,9 @@ proc registerAdditionalOps*(c: PCtx) = wrap1f_math(arccos) wrap1f_math(arcsin) wrap1f_math(arctan) + wrap1f_math(arcsinh) + wrap1f_math(arccosh) + wrap1f_math(arctanh) wrap2f_math(arctan2) wrap1f_math(cos) wrap1f_math(cosh) @@ -167,6 +172,10 @@ proc registerAdditionalOps*(c: PCtx) = wrap1f_math(trunc) wrap1f_math(floor) wrap1f_math(ceil) + wrap1f_math(erf) + wrap1f_math(erfc) + wrap1f_math(gamma) + wrap1f_math(lgamma) wrap1s(getMD5, md5op) diff --git a/tests/stdlib/tmath.nim b/tests/stdlib/tmath.nim index ff1f32d364..a255e4c09a 100644 --- a/tests/stdlib/tmath.nim +++ b/tests/stdlib/tmath.nim @@ -213,6 +213,25 @@ block: doAssert(classify(trunc(f_nan.float32)) == fcNan) doAssert(classify(trunc(0.0'f32)) == fcZero) + block: + when not defined(js): + # check for no side effect annotation + proc mySqrt(num: float): float {.noSideEffect.} = + # xxx unused + sqrt(num) + + # check gamma function + doAssert gamma(5.0) == 24.0 # 4! + doAssert almostEqual(gamma(0.5), sqrt(PI)) + doAssert almostEqual(gamma(-0.5), -2 * sqrt(PI)) + doAssert lgamma(1.0) == 0.0 # ln(1.0) == 0.0 + doAssert almostEqual(lgamma(0.5), 0.5 * ln(PI)) + doAssert erf(6.0) > erf(5.0) + doAssert erfc(6.0) < erfc(5.0) + + when not defined(js) and not defined(windows): # xxx pending bug #17017 + doAssert gamma(-1.0).isNaN + block: # sgn() tests assert sgn(1'i8) == 1 assert sgn(1'i16) == 1