Skip to content

y5gfunc.expr.expr_utils

expr_utils

Attributes:

Name Type Description
math_functions str

math_functions module-attribute

math_functions: str = '\nfunction fma(var1, var2, var3) {\n    return var1 * var2 + var3\n}\n\nfunction copysign(val, sign) {\n    return (sign < 0) ? -abs(val) : abs(val)\n}\n\n# https://stackoverflow.com/a/23097989\nfunction atan(var) {\n    zz = abs(var)\n    aa = (zz > 1) ? (1 / zz) : zz\n    ss = aa ** 2\n    qq = ss ** 2\n    pp =             -2.0258553044340116e-5\n    tt =              2.2302240345710764e-4\n    pp = fma(pp, qq, -1.1640717779912220e-3)\n    tt = fma(tt, qq,  3.8559749383656407e-3)\n    pp = fma(pp, qq, -9.1845592187222193e-3)\n    tt = fma(tt, qq,  1.6978035834594660e-2)\n    pp = fma(pp, qq, -2.5826796814492296e-2)\n    tt = fma(tt, qq,  3.4067811082715810e-2)\n    pp = fma(pp, qq, -4.0926382420509999e-2)\n    tt = fma(tt, qq,  4.6739496199158334e-2)\n    pp = fma(pp, qq, -5.2392330054601366e-2)\n    tt = fma(tt, qq,  5.8773077721790683e-2)\n    pp = fma(pp, qq, -6.6658603633512892e-2)\n    tt = fma(tt, qq,  7.6922129305867892e-2)\n    pp = fma(pp, ss,                     tt)\n    pp = fma(pp, ss, -9.0909012354005267e-2)\n    pp = fma(pp, ss,  1.1111110678749421e-1)\n    pp = fma(pp, ss, -1.4285714271334810e-1)\n    pp = fma(pp, ss,  1.9999999999755005e-1)\n    pp = fma(pp, ss, -3.3333333333331838e-1)\n    pp = fma(pp * ss, aa, aa)\n    rr = (zz > 1) ? fma(0.93282184640716537, 1.6839188885261840, -pp): pp\n    return copysign(rr, var)\n}\n\nfunction atan2(var_y, var_x) {\n    theta = 0\n    theta = (var_x > 0) ? atan(var_y / var_x) : theta\n    theta = (var_x < 0) ? (atan(var_y / var_x) + copysign($pi, var_y)) : theta\n    theta = ((var_x == 0) && var_y) ? (copysign($pi / 2, var_y)) : theta\n    theta = ((var_x == 0) && (var_y == 0)) ? 0 : theta\n    theta = (var_x == 0) ? copysign($pi / 2, var_y) : theta\n    return theta\n}\n\nfunction tan(var) {\n    return sin(var) / cos(var)\n}\n\nfunction cot(var) {\n    return cos(var) / sin(var)\n}\n\nfunction sec(var) {\n    return 1 / cos(var)\n}\n\nfunction csc(var) {\n    return 1 / sin(var)\n}\n\nfunction asin(var) {\n    return 2 * atan(var / (1 + sqrt(1 - var ** 2)))\n}\n\nfunction acos(var) {\n    return 2 * atan(sqrt((1 - var) / (1 + var)))\n}\n\nfunction acot(var) {\n    return $pi / 2 - atan(var)\n}\n\nfunction sinh(var) {\n    return (exp(var) - exp(-var)) / 2\n}\n\nfunction cosh(var) {\n    return (exp(var) + exp(-var)) / 2\n}\n\nfunction tanh(var) {\n    return (exp(2 * var) - 1) / (exp(2 * var) + 1)\n}\n\nfunction coth(var) {\n    return (exp(2 * var) + 1) / (exp(2 * var) - 1)\n}\n\nfunction sech(var) {\n    return 1 / cosh(var)\n}\n\nfunction csch(var) {\n    return 1 / sinh(var)\n}\n\nfunction arsinh(var) {\n    return log(var + sqrt(var ** 2 + 1))\n}\n\nfunction arcosh(var) {\n    return log(var + sqrt(var ** 2 - 1))\n}\n\nfunction artanh(var) {\n    return 0.5 * log((1 + var) / (1 - var))\n}\n\nfunction arcoth(var) {\n    return 0.5 * log((var + 1) / (var - 1))\n}\n\nfunction arsech(var) {\n    return log((1 + sqrt(1 - var ** 2)) / var)\n}\n\nfunction arcsch(var) {\n    return log(1 / var + sqrt(1 / (var ** 2) + 1))\n}\n\n# https://stackoverflow.com/a/77465269\nfunction cbrt(var) {\n    abs_var = abs(var)\n    est = abs_var ? exp(log(abs_var) / 3) : var\n    est = copysign(est, var)\n    cube = est ** 3 \n    return abs_var ? fma(-est, ((cube - var) / (2 * cube + var)), est) : var\n}\n\n# https://github.com/kravietz/nist-sts/blob/master/erf.c\nfunction erf(var) {\n    abs_var = abs(var)\n    tt = 1 / (1 + 0.3275911 * abs_var)\n    yy = 1 - (((((1.061405429 * tt + -1.453152027) * tt) + 1.421413741) * tt + -0.284496736) * tt + 0.254829592) * tt * exp(-abs_var * abs_var)\n    return copysign(yy, var)\n}\n\n# https://github.com/kravietz/nist-sts/blob/master/erf.c\nfunction erfc(var) {\n\tzz = abs(var)\n\ttt = 1 / (1 + 0.5 * zz)\n\tans = tt * exp(-zz * zz - 1.26551223 + tt * (1.00002368 + tt * (0.37409196 + tt * (0.09678418 + tt * (-0.18628806 + tt * (0.27886807 + tt * (-1.13520398 + tt * (1.48851587 + tt * (-0.82215223 + tt * 0.17087277)))))))))\n\treturn var >= 0 ? ans : 2 - ans\n}\n'