17db96d56Sopenharmony_ci/*[clinic input] 27db96d56Sopenharmony_cipreserve 37db96d56Sopenharmony_ci[clinic start generated code]*/ 47db96d56Sopenharmony_ci 57db96d56Sopenharmony_ciPyDoc_STRVAR(math_ceil__doc__, 67db96d56Sopenharmony_ci"ceil($module, x, /)\n" 77db96d56Sopenharmony_ci"--\n" 87db96d56Sopenharmony_ci"\n" 97db96d56Sopenharmony_ci"Return the ceiling of x as an Integral.\n" 107db96d56Sopenharmony_ci"\n" 117db96d56Sopenharmony_ci"This is the smallest integer >= x."); 127db96d56Sopenharmony_ci 137db96d56Sopenharmony_ci#define MATH_CEIL_METHODDEF \ 147db96d56Sopenharmony_ci {"ceil", (PyCFunction)math_ceil, METH_O, math_ceil__doc__}, 157db96d56Sopenharmony_ci 167db96d56Sopenharmony_ciPyDoc_STRVAR(math_floor__doc__, 177db96d56Sopenharmony_ci"floor($module, x, /)\n" 187db96d56Sopenharmony_ci"--\n" 197db96d56Sopenharmony_ci"\n" 207db96d56Sopenharmony_ci"Return the floor of x as an Integral.\n" 217db96d56Sopenharmony_ci"\n" 227db96d56Sopenharmony_ci"This is the largest integer <= x."); 237db96d56Sopenharmony_ci 247db96d56Sopenharmony_ci#define MATH_FLOOR_METHODDEF \ 257db96d56Sopenharmony_ci {"floor", (PyCFunction)math_floor, METH_O, math_floor__doc__}, 267db96d56Sopenharmony_ci 277db96d56Sopenharmony_ciPyDoc_STRVAR(math_fsum__doc__, 287db96d56Sopenharmony_ci"fsum($module, seq, /)\n" 297db96d56Sopenharmony_ci"--\n" 307db96d56Sopenharmony_ci"\n" 317db96d56Sopenharmony_ci"Return an accurate floating point sum of values in the iterable seq.\n" 327db96d56Sopenharmony_ci"\n" 337db96d56Sopenharmony_ci"Assumes IEEE-754 floating point arithmetic."); 347db96d56Sopenharmony_ci 357db96d56Sopenharmony_ci#define MATH_FSUM_METHODDEF \ 367db96d56Sopenharmony_ci {"fsum", (PyCFunction)math_fsum, METH_O, math_fsum__doc__}, 377db96d56Sopenharmony_ci 387db96d56Sopenharmony_ciPyDoc_STRVAR(math_isqrt__doc__, 397db96d56Sopenharmony_ci"isqrt($module, n, /)\n" 407db96d56Sopenharmony_ci"--\n" 417db96d56Sopenharmony_ci"\n" 427db96d56Sopenharmony_ci"Return the integer part of the square root of the input."); 437db96d56Sopenharmony_ci 447db96d56Sopenharmony_ci#define MATH_ISQRT_METHODDEF \ 457db96d56Sopenharmony_ci {"isqrt", (PyCFunction)math_isqrt, METH_O, math_isqrt__doc__}, 467db96d56Sopenharmony_ci 477db96d56Sopenharmony_ciPyDoc_STRVAR(math_factorial__doc__, 487db96d56Sopenharmony_ci"factorial($module, n, /)\n" 497db96d56Sopenharmony_ci"--\n" 507db96d56Sopenharmony_ci"\n" 517db96d56Sopenharmony_ci"Find n!.\n" 527db96d56Sopenharmony_ci"\n" 537db96d56Sopenharmony_ci"Raise a ValueError if x is negative or non-integral."); 547db96d56Sopenharmony_ci 557db96d56Sopenharmony_ci#define MATH_FACTORIAL_METHODDEF \ 567db96d56Sopenharmony_ci {"factorial", (PyCFunction)math_factorial, METH_O, math_factorial__doc__}, 577db96d56Sopenharmony_ci 587db96d56Sopenharmony_ciPyDoc_STRVAR(math_trunc__doc__, 597db96d56Sopenharmony_ci"trunc($module, x, /)\n" 607db96d56Sopenharmony_ci"--\n" 617db96d56Sopenharmony_ci"\n" 627db96d56Sopenharmony_ci"Truncates the Real x to the nearest Integral toward 0.\n" 637db96d56Sopenharmony_ci"\n" 647db96d56Sopenharmony_ci"Uses the __trunc__ magic method."); 657db96d56Sopenharmony_ci 667db96d56Sopenharmony_ci#define MATH_TRUNC_METHODDEF \ 677db96d56Sopenharmony_ci {"trunc", (PyCFunction)math_trunc, METH_O, math_trunc__doc__}, 687db96d56Sopenharmony_ci 697db96d56Sopenharmony_ciPyDoc_STRVAR(math_frexp__doc__, 707db96d56Sopenharmony_ci"frexp($module, x, /)\n" 717db96d56Sopenharmony_ci"--\n" 727db96d56Sopenharmony_ci"\n" 737db96d56Sopenharmony_ci"Return the mantissa and exponent of x, as pair (m, e).\n" 747db96d56Sopenharmony_ci"\n" 757db96d56Sopenharmony_ci"m is a float and e is an int, such that x = m * 2.**e.\n" 767db96d56Sopenharmony_ci"If x is 0, m and e are both 0. Else 0.5 <= abs(m) < 1.0."); 777db96d56Sopenharmony_ci 787db96d56Sopenharmony_ci#define MATH_FREXP_METHODDEF \ 797db96d56Sopenharmony_ci {"frexp", (PyCFunction)math_frexp, METH_O, math_frexp__doc__}, 807db96d56Sopenharmony_ci 817db96d56Sopenharmony_cistatic PyObject * 827db96d56Sopenharmony_cimath_frexp_impl(PyObject *module, double x); 837db96d56Sopenharmony_ci 847db96d56Sopenharmony_cistatic PyObject * 857db96d56Sopenharmony_cimath_frexp(PyObject *module, PyObject *arg) 867db96d56Sopenharmony_ci{ 877db96d56Sopenharmony_ci PyObject *return_value = NULL; 887db96d56Sopenharmony_ci double x; 897db96d56Sopenharmony_ci 907db96d56Sopenharmony_ci if (PyFloat_CheckExact(arg)) { 917db96d56Sopenharmony_ci x = PyFloat_AS_DOUBLE(arg); 927db96d56Sopenharmony_ci } 937db96d56Sopenharmony_ci else 947db96d56Sopenharmony_ci { 957db96d56Sopenharmony_ci x = PyFloat_AsDouble(arg); 967db96d56Sopenharmony_ci if (x == -1.0 && PyErr_Occurred()) { 977db96d56Sopenharmony_ci goto exit; 987db96d56Sopenharmony_ci } 997db96d56Sopenharmony_ci } 1007db96d56Sopenharmony_ci return_value = math_frexp_impl(module, x); 1017db96d56Sopenharmony_ci 1027db96d56Sopenharmony_ciexit: 1037db96d56Sopenharmony_ci return return_value; 1047db96d56Sopenharmony_ci} 1057db96d56Sopenharmony_ci 1067db96d56Sopenharmony_ciPyDoc_STRVAR(math_ldexp__doc__, 1077db96d56Sopenharmony_ci"ldexp($module, x, i, /)\n" 1087db96d56Sopenharmony_ci"--\n" 1097db96d56Sopenharmony_ci"\n" 1107db96d56Sopenharmony_ci"Return x * (2**i).\n" 1117db96d56Sopenharmony_ci"\n" 1127db96d56Sopenharmony_ci"This is essentially the inverse of frexp()."); 1137db96d56Sopenharmony_ci 1147db96d56Sopenharmony_ci#define MATH_LDEXP_METHODDEF \ 1157db96d56Sopenharmony_ci {"ldexp", _PyCFunction_CAST(math_ldexp), METH_FASTCALL, math_ldexp__doc__}, 1167db96d56Sopenharmony_ci 1177db96d56Sopenharmony_cistatic PyObject * 1187db96d56Sopenharmony_cimath_ldexp_impl(PyObject *module, double x, PyObject *i); 1197db96d56Sopenharmony_ci 1207db96d56Sopenharmony_cistatic PyObject * 1217db96d56Sopenharmony_cimath_ldexp(PyObject *module, PyObject *const *args, Py_ssize_t nargs) 1227db96d56Sopenharmony_ci{ 1237db96d56Sopenharmony_ci PyObject *return_value = NULL; 1247db96d56Sopenharmony_ci double x; 1257db96d56Sopenharmony_ci PyObject *i; 1267db96d56Sopenharmony_ci 1277db96d56Sopenharmony_ci if (!_PyArg_CheckPositional("ldexp", nargs, 2, 2)) { 1287db96d56Sopenharmony_ci goto exit; 1297db96d56Sopenharmony_ci } 1307db96d56Sopenharmony_ci if (PyFloat_CheckExact(args[0])) { 1317db96d56Sopenharmony_ci x = PyFloat_AS_DOUBLE(args[0]); 1327db96d56Sopenharmony_ci } 1337db96d56Sopenharmony_ci else 1347db96d56Sopenharmony_ci { 1357db96d56Sopenharmony_ci x = PyFloat_AsDouble(args[0]); 1367db96d56Sopenharmony_ci if (x == -1.0 && PyErr_Occurred()) { 1377db96d56Sopenharmony_ci goto exit; 1387db96d56Sopenharmony_ci } 1397db96d56Sopenharmony_ci } 1407db96d56Sopenharmony_ci i = args[1]; 1417db96d56Sopenharmony_ci return_value = math_ldexp_impl(module, x, i); 1427db96d56Sopenharmony_ci 1437db96d56Sopenharmony_ciexit: 1447db96d56Sopenharmony_ci return return_value; 1457db96d56Sopenharmony_ci} 1467db96d56Sopenharmony_ci 1477db96d56Sopenharmony_ciPyDoc_STRVAR(math_modf__doc__, 1487db96d56Sopenharmony_ci"modf($module, x, /)\n" 1497db96d56Sopenharmony_ci"--\n" 1507db96d56Sopenharmony_ci"\n" 1517db96d56Sopenharmony_ci"Return the fractional and integer parts of x.\n" 1527db96d56Sopenharmony_ci"\n" 1537db96d56Sopenharmony_ci"Both results carry the sign of x and are floats."); 1547db96d56Sopenharmony_ci 1557db96d56Sopenharmony_ci#define MATH_MODF_METHODDEF \ 1567db96d56Sopenharmony_ci {"modf", (PyCFunction)math_modf, METH_O, math_modf__doc__}, 1577db96d56Sopenharmony_ci 1587db96d56Sopenharmony_cistatic PyObject * 1597db96d56Sopenharmony_cimath_modf_impl(PyObject *module, double x); 1607db96d56Sopenharmony_ci 1617db96d56Sopenharmony_cistatic PyObject * 1627db96d56Sopenharmony_cimath_modf(PyObject *module, PyObject *arg) 1637db96d56Sopenharmony_ci{ 1647db96d56Sopenharmony_ci PyObject *return_value = NULL; 1657db96d56Sopenharmony_ci double x; 1667db96d56Sopenharmony_ci 1677db96d56Sopenharmony_ci if (PyFloat_CheckExact(arg)) { 1687db96d56Sopenharmony_ci x = PyFloat_AS_DOUBLE(arg); 1697db96d56Sopenharmony_ci } 1707db96d56Sopenharmony_ci else 1717db96d56Sopenharmony_ci { 1727db96d56Sopenharmony_ci x = PyFloat_AsDouble(arg); 1737db96d56Sopenharmony_ci if (x == -1.0 && PyErr_Occurred()) { 1747db96d56Sopenharmony_ci goto exit; 1757db96d56Sopenharmony_ci } 1767db96d56Sopenharmony_ci } 1777db96d56Sopenharmony_ci return_value = math_modf_impl(module, x); 1787db96d56Sopenharmony_ci 1797db96d56Sopenharmony_ciexit: 1807db96d56Sopenharmony_ci return return_value; 1817db96d56Sopenharmony_ci} 1827db96d56Sopenharmony_ci 1837db96d56Sopenharmony_ciPyDoc_STRVAR(math_log__doc__, 1847db96d56Sopenharmony_ci"log(x, [base=math.e])\n" 1857db96d56Sopenharmony_ci"Return the logarithm of x to the given base.\n" 1867db96d56Sopenharmony_ci"\n" 1877db96d56Sopenharmony_ci"If the base not specified, returns the natural logarithm (base e) of x."); 1887db96d56Sopenharmony_ci 1897db96d56Sopenharmony_ci#define MATH_LOG_METHODDEF \ 1907db96d56Sopenharmony_ci {"log", (PyCFunction)math_log, METH_VARARGS, math_log__doc__}, 1917db96d56Sopenharmony_ci 1927db96d56Sopenharmony_cistatic PyObject * 1937db96d56Sopenharmony_cimath_log_impl(PyObject *module, PyObject *x, int group_right_1, 1947db96d56Sopenharmony_ci PyObject *base); 1957db96d56Sopenharmony_ci 1967db96d56Sopenharmony_cistatic PyObject * 1977db96d56Sopenharmony_cimath_log(PyObject *module, PyObject *args) 1987db96d56Sopenharmony_ci{ 1997db96d56Sopenharmony_ci PyObject *return_value = NULL; 2007db96d56Sopenharmony_ci PyObject *x; 2017db96d56Sopenharmony_ci int group_right_1 = 0; 2027db96d56Sopenharmony_ci PyObject *base = NULL; 2037db96d56Sopenharmony_ci 2047db96d56Sopenharmony_ci switch (PyTuple_GET_SIZE(args)) { 2057db96d56Sopenharmony_ci case 1: 2067db96d56Sopenharmony_ci if (!PyArg_ParseTuple(args, "O:log", &x)) { 2077db96d56Sopenharmony_ci goto exit; 2087db96d56Sopenharmony_ci } 2097db96d56Sopenharmony_ci break; 2107db96d56Sopenharmony_ci case 2: 2117db96d56Sopenharmony_ci if (!PyArg_ParseTuple(args, "OO:log", &x, &base)) { 2127db96d56Sopenharmony_ci goto exit; 2137db96d56Sopenharmony_ci } 2147db96d56Sopenharmony_ci group_right_1 = 1; 2157db96d56Sopenharmony_ci break; 2167db96d56Sopenharmony_ci default: 2177db96d56Sopenharmony_ci PyErr_SetString(PyExc_TypeError, "math.log requires 1 to 2 arguments"); 2187db96d56Sopenharmony_ci goto exit; 2197db96d56Sopenharmony_ci } 2207db96d56Sopenharmony_ci return_value = math_log_impl(module, x, group_right_1, base); 2217db96d56Sopenharmony_ci 2227db96d56Sopenharmony_ciexit: 2237db96d56Sopenharmony_ci return return_value; 2247db96d56Sopenharmony_ci} 2257db96d56Sopenharmony_ci 2267db96d56Sopenharmony_ciPyDoc_STRVAR(math_log2__doc__, 2277db96d56Sopenharmony_ci"log2($module, x, /)\n" 2287db96d56Sopenharmony_ci"--\n" 2297db96d56Sopenharmony_ci"\n" 2307db96d56Sopenharmony_ci"Return the base 2 logarithm of x."); 2317db96d56Sopenharmony_ci 2327db96d56Sopenharmony_ci#define MATH_LOG2_METHODDEF \ 2337db96d56Sopenharmony_ci {"log2", (PyCFunction)math_log2, METH_O, math_log2__doc__}, 2347db96d56Sopenharmony_ci 2357db96d56Sopenharmony_ciPyDoc_STRVAR(math_log10__doc__, 2367db96d56Sopenharmony_ci"log10($module, x, /)\n" 2377db96d56Sopenharmony_ci"--\n" 2387db96d56Sopenharmony_ci"\n" 2397db96d56Sopenharmony_ci"Return the base 10 logarithm of x."); 2407db96d56Sopenharmony_ci 2417db96d56Sopenharmony_ci#define MATH_LOG10_METHODDEF \ 2427db96d56Sopenharmony_ci {"log10", (PyCFunction)math_log10, METH_O, math_log10__doc__}, 2437db96d56Sopenharmony_ci 2447db96d56Sopenharmony_ciPyDoc_STRVAR(math_fmod__doc__, 2457db96d56Sopenharmony_ci"fmod($module, x, y, /)\n" 2467db96d56Sopenharmony_ci"--\n" 2477db96d56Sopenharmony_ci"\n" 2487db96d56Sopenharmony_ci"Return fmod(x, y), according to platform C.\n" 2497db96d56Sopenharmony_ci"\n" 2507db96d56Sopenharmony_ci"x % y may differ."); 2517db96d56Sopenharmony_ci 2527db96d56Sopenharmony_ci#define MATH_FMOD_METHODDEF \ 2537db96d56Sopenharmony_ci {"fmod", _PyCFunction_CAST(math_fmod), METH_FASTCALL, math_fmod__doc__}, 2547db96d56Sopenharmony_ci 2557db96d56Sopenharmony_cistatic PyObject * 2567db96d56Sopenharmony_cimath_fmod_impl(PyObject *module, double x, double y); 2577db96d56Sopenharmony_ci 2587db96d56Sopenharmony_cistatic PyObject * 2597db96d56Sopenharmony_cimath_fmod(PyObject *module, PyObject *const *args, Py_ssize_t nargs) 2607db96d56Sopenharmony_ci{ 2617db96d56Sopenharmony_ci PyObject *return_value = NULL; 2627db96d56Sopenharmony_ci double x; 2637db96d56Sopenharmony_ci double y; 2647db96d56Sopenharmony_ci 2657db96d56Sopenharmony_ci if (!_PyArg_CheckPositional("fmod", nargs, 2, 2)) { 2667db96d56Sopenharmony_ci goto exit; 2677db96d56Sopenharmony_ci } 2687db96d56Sopenharmony_ci if (PyFloat_CheckExact(args[0])) { 2697db96d56Sopenharmony_ci x = PyFloat_AS_DOUBLE(args[0]); 2707db96d56Sopenharmony_ci } 2717db96d56Sopenharmony_ci else 2727db96d56Sopenharmony_ci { 2737db96d56Sopenharmony_ci x = PyFloat_AsDouble(args[0]); 2747db96d56Sopenharmony_ci if (x == -1.0 && PyErr_Occurred()) { 2757db96d56Sopenharmony_ci goto exit; 2767db96d56Sopenharmony_ci } 2777db96d56Sopenharmony_ci } 2787db96d56Sopenharmony_ci if (PyFloat_CheckExact(args[1])) { 2797db96d56Sopenharmony_ci y = PyFloat_AS_DOUBLE(args[1]); 2807db96d56Sopenharmony_ci } 2817db96d56Sopenharmony_ci else 2827db96d56Sopenharmony_ci { 2837db96d56Sopenharmony_ci y = PyFloat_AsDouble(args[1]); 2847db96d56Sopenharmony_ci if (y == -1.0 && PyErr_Occurred()) { 2857db96d56Sopenharmony_ci goto exit; 2867db96d56Sopenharmony_ci } 2877db96d56Sopenharmony_ci } 2887db96d56Sopenharmony_ci return_value = math_fmod_impl(module, x, y); 2897db96d56Sopenharmony_ci 2907db96d56Sopenharmony_ciexit: 2917db96d56Sopenharmony_ci return return_value; 2927db96d56Sopenharmony_ci} 2937db96d56Sopenharmony_ci 2947db96d56Sopenharmony_ciPyDoc_STRVAR(math_dist__doc__, 2957db96d56Sopenharmony_ci"dist($module, p, q, /)\n" 2967db96d56Sopenharmony_ci"--\n" 2977db96d56Sopenharmony_ci"\n" 2987db96d56Sopenharmony_ci"Return the Euclidean distance between two points p and q.\n" 2997db96d56Sopenharmony_ci"\n" 3007db96d56Sopenharmony_ci"The points should be specified as sequences (or iterables) of\n" 3017db96d56Sopenharmony_ci"coordinates. Both inputs must have the same dimension.\n" 3027db96d56Sopenharmony_ci"\n" 3037db96d56Sopenharmony_ci"Roughly equivalent to:\n" 3047db96d56Sopenharmony_ci" sqrt(sum((px - qx) ** 2.0 for px, qx in zip(p, q)))"); 3057db96d56Sopenharmony_ci 3067db96d56Sopenharmony_ci#define MATH_DIST_METHODDEF \ 3077db96d56Sopenharmony_ci {"dist", _PyCFunction_CAST(math_dist), METH_FASTCALL, math_dist__doc__}, 3087db96d56Sopenharmony_ci 3097db96d56Sopenharmony_cistatic PyObject * 3107db96d56Sopenharmony_cimath_dist_impl(PyObject *module, PyObject *p, PyObject *q); 3117db96d56Sopenharmony_ci 3127db96d56Sopenharmony_cistatic PyObject * 3137db96d56Sopenharmony_cimath_dist(PyObject *module, PyObject *const *args, Py_ssize_t nargs) 3147db96d56Sopenharmony_ci{ 3157db96d56Sopenharmony_ci PyObject *return_value = NULL; 3167db96d56Sopenharmony_ci PyObject *p; 3177db96d56Sopenharmony_ci PyObject *q; 3187db96d56Sopenharmony_ci 3197db96d56Sopenharmony_ci if (!_PyArg_CheckPositional("dist", nargs, 2, 2)) { 3207db96d56Sopenharmony_ci goto exit; 3217db96d56Sopenharmony_ci } 3227db96d56Sopenharmony_ci p = args[0]; 3237db96d56Sopenharmony_ci q = args[1]; 3247db96d56Sopenharmony_ci return_value = math_dist_impl(module, p, q); 3257db96d56Sopenharmony_ci 3267db96d56Sopenharmony_ciexit: 3277db96d56Sopenharmony_ci return return_value; 3287db96d56Sopenharmony_ci} 3297db96d56Sopenharmony_ci 3307db96d56Sopenharmony_ciPyDoc_STRVAR(math_pow__doc__, 3317db96d56Sopenharmony_ci"pow($module, x, y, /)\n" 3327db96d56Sopenharmony_ci"--\n" 3337db96d56Sopenharmony_ci"\n" 3347db96d56Sopenharmony_ci"Return x**y (x to the power of y)."); 3357db96d56Sopenharmony_ci 3367db96d56Sopenharmony_ci#define MATH_POW_METHODDEF \ 3377db96d56Sopenharmony_ci {"pow", _PyCFunction_CAST(math_pow), METH_FASTCALL, math_pow__doc__}, 3387db96d56Sopenharmony_ci 3397db96d56Sopenharmony_cistatic PyObject * 3407db96d56Sopenharmony_cimath_pow_impl(PyObject *module, double x, double y); 3417db96d56Sopenharmony_ci 3427db96d56Sopenharmony_cistatic PyObject * 3437db96d56Sopenharmony_cimath_pow(PyObject *module, PyObject *const *args, Py_ssize_t nargs) 3447db96d56Sopenharmony_ci{ 3457db96d56Sopenharmony_ci PyObject *return_value = NULL; 3467db96d56Sopenharmony_ci double x; 3477db96d56Sopenharmony_ci double y; 3487db96d56Sopenharmony_ci 3497db96d56Sopenharmony_ci if (!_PyArg_CheckPositional("pow", nargs, 2, 2)) { 3507db96d56Sopenharmony_ci goto exit; 3517db96d56Sopenharmony_ci } 3527db96d56Sopenharmony_ci if (PyFloat_CheckExact(args[0])) { 3537db96d56Sopenharmony_ci x = PyFloat_AS_DOUBLE(args[0]); 3547db96d56Sopenharmony_ci } 3557db96d56Sopenharmony_ci else 3567db96d56Sopenharmony_ci { 3577db96d56Sopenharmony_ci x = PyFloat_AsDouble(args[0]); 3587db96d56Sopenharmony_ci if (x == -1.0 && PyErr_Occurred()) { 3597db96d56Sopenharmony_ci goto exit; 3607db96d56Sopenharmony_ci } 3617db96d56Sopenharmony_ci } 3627db96d56Sopenharmony_ci if (PyFloat_CheckExact(args[1])) { 3637db96d56Sopenharmony_ci y = PyFloat_AS_DOUBLE(args[1]); 3647db96d56Sopenharmony_ci } 3657db96d56Sopenharmony_ci else 3667db96d56Sopenharmony_ci { 3677db96d56Sopenharmony_ci y = PyFloat_AsDouble(args[1]); 3687db96d56Sopenharmony_ci if (y == -1.0 && PyErr_Occurred()) { 3697db96d56Sopenharmony_ci goto exit; 3707db96d56Sopenharmony_ci } 3717db96d56Sopenharmony_ci } 3727db96d56Sopenharmony_ci return_value = math_pow_impl(module, x, y); 3737db96d56Sopenharmony_ci 3747db96d56Sopenharmony_ciexit: 3757db96d56Sopenharmony_ci return return_value; 3767db96d56Sopenharmony_ci} 3777db96d56Sopenharmony_ci 3787db96d56Sopenharmony_ciPyDoc_STRVAR(math_degrees__doc__, 3797db96d56Sopenharmony_ci"degrees($module, x, /)\n" 3807db96d56Sopenharmony_ci"--\n" 3817db96d56Sopenharmony_ci"\n" 3827db96d56Sopenharmony_ci"Convert angle x from radians to degrees."); 3837db96d56Sopenharmony_ci 3847db96d56Sopenharmony_ci#define MATH_DEGREES_METHODDEF \ 3857db96d56Sopenharmony_ci {"degrees", (PyCFunction)math_degrees, METH_O, math_degrees__doc__}, 3867db96d56Sopenharmony_ci 3877db96d56Sopenharmony_cistatic PyObject * 3887db96d56Sopenharmony_cimath_degrees_impl(PyObject *module, double x); 3897db96d56Sopenharmony_ci 3907db96d56Sopenharmony_cistatic PyObject * 3917db96d56Sopenharmony_cimath_degrees(PyObject *module, PyObject *arg) 3927db96d56Sopenharmony_ci{ 3937db96d56Sopenharmony_ci PyObject *return_value = NULL; 3947db96d56Sopenharmony_ci double x; 3957db96d56Sopenharmony_ci 3967db96d56Sopenharmony_ci if (PyFloat_CheckExact(arg)) { 3977db96d56Sopenharmony_ci x = PyFloat_AS_DOUBLE(arg); 3987db96d56Sopenharmony_ci } 3997db96d56Sopenharmony_ci else 4007db96d56Sopenharmony_ci { 4017db96d56Sopenharmony_ci x = PyFloat_AsDouble(arg); 4027db96d56Sopenharmony_ci if (x == -1.0 && PyErr_Occurred()) { 4037db96d56Sopenharmony_ci goto exit; 4047db96d56Sopenharmony_ci } 4057db96d56Sopenharmony_ci } 4067db96d56Sopenharmony_ci return_value = math_degrees_impl(module, x); 4077db96d56Sopenharmony_ci 4087db96d56Sopenharmony_ciexit: 4097db96d56Sopenharmony_ci return return_value; 4107db96d56Sopenharmony_ci} 4117db96d56Sopenharmony_ci 4127db96d56Sopenharmony_ciPyDoc_STRVAR(math_radians__doc__, 4137db96d56Sopenharmony_ci"radians($module, x, /)\n" 4147db96d56Sopenharmony_ci"--\n" 4157db96d56Sopenharmony_ci"\n" 4167db96d56Sopenharmony_ci"Convert angle x from degrees to radians."); 4177db96d56Sopenharmony_ci 4187db96d56Sopenharmony_ci#define MATH_RADIANS_METHODDEF \ 4197db96d56Sopenharmony_ci {"radians", (PyCFunction)math_radians, METH_O, math_radians__doc__}, 4207db96d56Sopenharmony_ci 4217db96d56Sopenharmony_cistatic PyObject * 4227db96d56Sopenharmony_cimath_radians_impl(PyObject *module, double x); 4237db96d56Sopenharmony_ci 4247db96d56Sopenharmony_cistatic PyObject * 4257db96d56Sopenharmony_cimath_radians(PyObject *module, PyObject *arg) 4267db96d56Sopenharmony_ci{ 4277db96d56Sopenharmony_ci PyObject *return_value = NULL; 4287db96d56Sopenharmony_ci double x; 4297db96d56Sopenharmony_ci 4307db96d56Sopenharmony_ci if (PyFloat_CheckExact(arg)) { 4317db96d56Sopenharmony_ci x = PyFloat_AS_DOUBLE(arg); 4327db96d56Sopenharmony_ci } 4337db96d56Sopenharmony_ci else 4347db96d56Sopenharmony_ci { 4357db96d56Sopenharmony_ci x = PyFloat_AsDouble(arg); 4367db96d56Sopenharmony_ci if (x == -1.0 && PyErr_Occurred()) { 4377db96d56Sopenharmony_ci goto exit; 4387db96d56Sopenharmony_ci } 4397db96d56Sopenharmony_ci } 4407db96d56Sopenharmony_ci return_value = math_radians_impl(module, x); 4417db96d56Sopenharmony_ci 4427db96d56Sopenharmony_ciexit: 4437db96d56Sopenharmony_ci return return_value; 4447db96d56Sopenharmony_ci} 4457db96d56Sopenharmony_ci 4467db96d56Sopenharmony_ciPyDoc_STRVAR(math_isfinite__doc__, 4477db96d56Sopenharmony_ci"isfinite($module, x, /)\n" 4487db96d56Sopenharmony_ci"--\n" 4497db96d56Sopenharmony_ci"\n" 4507db96d56Sopenharmony_ci"Return True if x is neither an infinity nor a NaN, and False otherwise."); 4517db96d56Sopenharmony_ci 4527db96d56Sopenharmony_ci#define MATH_ISFINITE_METHODDEF \ 4537db96d56Sopenharmony_ci {"isfinite", (PyCFunction)math_isfinite, METH_O, math_isfinite__doc__}, 4547db96d56Sopenharmony_ci 4557db96d56Sopenharmony_cistatic PyObject * 4567db96d56Sopenharmony_cimath_isfinite_impl(PyObject *module, double x); 4577db96d56Sopenharmony_ci 4587db96d56Sopenharmony_cistatic PyObject * 4597db96d56Sopenharmony_cimath_isfinite(PyObject *module, PyObject *arg) 4607db96d56Sopenharmony_ci{ 4617db96d56Sopenharmony_ci PyObject *return_value = NULL; 4627db96d56Sopenharmony_ci double x; 4637db96d56Sopenharmony_ci 4647db96d56Sopenharmony_ci if (PyFloat_CheckExact(arg)) { 4657db96d56Sopenharmony_ci x = PyFloat_AS_DOUBLE(arg); 4667db96d56Sopenharmony_ci } 4677db96d56Sopenharmony_ci else 4687db96d56Sopenharmony_ci { 4697db96d56Sopenharmony_ci x = PyFloat_AsDouble(arg); 4707db96d56Sopenharmony_ci if (x == -1.0 && PyErr_Occurred()) { 4717db96d56Sopenharmony_ci goto exit; 4727db96d56Sopenharmony_ci } 4737db96d56Sopenharmony_ci } 4747db96d56Sopenharmony_ci return_value = math_isfinite_impl(module, x); 4757db96d56Sopenharmony_ci 4767db96d56Sopenharmony_ciexit: 4777db96d56Sopenharmony_ci return return_value; 4787db96d56Sopenharmony_ci} 4797db96d56Sopenharmony_ci 4807db96d56Sopenharmony_ciPyDoc_STRVAR(math_isnan__doc__, 4817db96d56Sopenharmony_ci"isnan($module, x, /)\n" 4827db96d56Sopenharmony_ci"--\n" 4837db96d56Sopenharmony_ci"\n" 4847db96d56Sopenharmony_ci"Return True if x is a NaN (not a number), and False otherwise."); 4857db96d56Sopenharmony_ci 4867db96d56Sopenharmony_ci#define MATH_ISNAN_METHODDEF \ 4877db96d56Sopenharmony_ci {"isnan", (PyCFunction)math_isnan, METH_O, math_isnan__doc__}, 4887db96d56Sopenharmony_ci 4897db96d56Sopenharmony_cistatic PyObject * 4907db96d56Sopenharmony_cimath_isnan_impl(PyObject *module, double x); 4917db96d56Sopenharmony_ci 4927db96d56Sopenharmony_cistatic PyObject * 4937db96d56Sopenharmony_cimath_isnan(PyObject *module, PyObject *arg) 4947db96d56Sopenharmony_ci{ 4957db96d56Sopenharmony_ci PyObject *return_value = NULL; 4967db96d56Sopenharmony_ci double x; 4977db96d56Sopenharmony_ci 4987db96d56Sopenharmony_ci if (PyFloat_CheckExact(arg)) { 4997db96d56Sopenharmony_ci x = PyFloat_AS_DOUBLE(arg); 5007db96d56Sopenharmony_ci } 5017db96d56Sopenharmony_ci else 5027db96d56Sopenharmony_ci { 5037db96d56Sopenharmony_ci x = PyFloat_AsDouble(arg); 5047db96d56Sopenharmony_ci if (x == -1.0 && PyErr_Occurred()) { 5057db96d56Sopenharmony_ci goto exit; 5067db96d56Sopenharmony_ci } 5077db96d56Sopenharmony_ci } 5087db96d56Sopenharmony_ci return_value = math_isnan_impl(module, x); 5097db96d56Sopenharmony_ci 5107db96d56Sopenharmony_ciexit: 5117db96d56Sopenharmony_ci return return_value; 5127db96d56Sopenharmony_ci} 5137db96d56Sopenharmony_ci 5147db96d56Sopenharmony_ciPyDoc_STRVAR(math_isinf__doc__, 5157db96d56Sopenharmony_ci"isinf($module, x, /)\n" 5167db96d56Sopenharmony_ci"--\n" 5177db96d56Sopenharmony_ci"\n" 5187db96d56Sopenharmony_ci"Return True if x is a positive or negative infinity, and False otherwise."); 5197db96d56Sopenharmony_ci 5207db96d56Sopenharmony_ci#define MATH_ISINF_METHODDEF \ 5217db96d56Sopenharmony_ci {"isinf", (PyCFunction)math_isinf, METH_O, math_isinf__doc__}, 5227db96d56Sopenharmony_ci 5237db96d56Sopenharmony_cistatic PyObject * 5247db96d56Sopenharmony_cimath_isinf_impl(PyObject *module, double x); 5257db96d56Sopenharmony_ci 5267db96d56Sopenharmony_cistatic PyObject * 5277db96d56Sopenharmony_cimath_isinf(PyObject *module, PyObject *arg) 5287db96d56Sopenharmony_ci{ 5297db96d56Sopenharmony_ci PyObject *return_value = NULL; 5307db96d56Sopenharmony_ci double x; 5317db96d56Sopenharmony_ci 5327db96d56Sopenharmony_ci if (PyFloat_CheckExact(arg)) { 5337db96d56Sopenharmony_ci x = PyFloat_AS_DOUBLE(arg); 5347db96d56Sopenharmony_ci } 5357db96d56Sopenharmony_ci else 5367db96d56Sopenharmony_ci { 5377db96d56Sopenharmony_ci x = PyFloat_AsDouble(arg); 5387db96d56Sopenharmony_ci if (x == -1.0 && PyErr_Occurred()) { 5397db96d56Sopenharmony_ci goto exit; 5407db96d56Sopenharmony_ci } 5417db96d56Sopenharmony_ci } 5427db96d56Sopenharmony_ci return_value = math_isinf_impl(module, x); 5437db96d56Sopenharmony_ci 5447db96d56Sopenharmony_ciexit: 5457db96d56Sopenharmony_ci return return_value; 5467db96d56Sopenharmony_ci} 5477db96d56Sopenharmony_ci 5487db96d56Sopenharmony_ciPyDoc_STRVAR(math_isclose__doc__, 5497db96d56Sopenharmony_ci"isclose($module, /, a, b, *, rel_tol=1e-09, abs_tol=0.0)\n" 5507db96d56Sopenharmony_ci"--\n" 5517db96d56Sopenharmony_ci"\n" 5527db96d56Sopenharmony_ci"Determine whether two floating point numbers are close in value.\n" 5537db96d56Sopenharmony_ci"\n" 5547db96d56Sopenharmony_ci" rel_tol\n" 5557db96d56Sopenharmony_ci" maximum difference for being considered \"close\", relative to the\n" 5567db96d56Sopenharmony_ci" magnitude of the input values\n" 5577db96d56Sopenharmony_ci" abs_tol\n" 5587db96d56Sopenharmony_ci" maximum difference for being considered \"close\", regardless of the\n" 5597db96d56Sopenharmony_ci" magnitude of the input values\n" 5607db96d56Sopenharmony_ci"\n" 5617db96d56Sopenharmony_ci"Return True if a is close in value to b, and False otherwise.\n" 5627db96d56Sopenharmony_ci"\n" 5637db96d56Sopenharmony_ci"For the values to be considered close, the difference between them\n" 5647db96d56Sopenharmony_ci"must be smaller than at least one of the tolerances.\n" 5657db96d56Sopenharmony_ci"\n" 5667db96d56Sopenharmony_ci"-inf, inf and NaN behave similarly to the IEEE 754 Standard. That\n" 5677db96d56Sopenharmony_ci"is, NaN is not close to anything, even itself. inf and -inf are\n" 5687db96d56Sopenharmony_ci"only close to themselves."); 5697db96d56Sopenharmony_ci 5707db96d56Sopenharmony_ci#define MATH_ISCLOSE_METHODDEF \ 5717db96d56Sopenharmony_ci {"isclose", _PyCFunction_CAST(math_isclose), METH_FASTCALL|METH_KEYWORDS, math_isclose__doc__}, 5727db96d56Sopenharmony_ci 5737db96d56Sopenharmony_cistatic int 5747db96d56Sopenharmony_cimath_isclose_impl(PyObject *module, double a, double b, double rel_tol, 5757db96d56Sopenharmony_ci double abs_tol); 5767db96d56Sopenharmony_ci 5777db96d56Sopenharmony_cistatic PyObject * 5787db96d56Sopenharmony_cimath_isclose(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) 5797db96d56Sopenharmony_ci{ 5807db96d56Sopenharmony_ci PyObject *return_value = NULL; 5817db96d56Sopenharmony_ci static const char * const _keywords[] = {"a", "b", "rel_tol", "abs_tol", NULL}; 5827db96d56Sopenharmony_ci static _PyArg_Parser _parser = {NULL, _keywords, "isclose", 0}; 5837db96d56Sopenharmony_ci PyObject *argsbuf[4]; 5847db96d56Sopenharmony_ci Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 2; 5857db96d56Sopenharmony_ci double a; 5867db96d56Sopenharmony_ci double b; 5877db96d56Sopenharmony_ci double rel_tol = 1e-09; 5887db96d56Sopenharmony_ci double abs_tol = 0.0; 5897db96d56Sopenharmony_ci int _return_value; 5907db96d56Sopenharmony_ci 5917db96d56Sopenharmony_ci args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 2, 0, argsbuf); 5927db96d56Sopenharmony_ci if (!args) { 5937db96d56Sopenharmony_ci goto exit; 5947db96d56Sopenharmony_ci } 5957db96d56Sopenharmony_ci if (PyFloat_CheckExact(args[0])) { 5967db96d56Sopenharmony_ci a = PyFloat_AS_DOUBLE(args[0]); 5977db96d56Sopenharmony_ci } 5987db96d56Sopenharmony_ci else 5997db96d56Sopenharmony_ci { 6007db96d56Sopenharmony_ci a = PyFloat_AsDouble(args[0]); 6017db96d56Sopenharmony_ci if (a == -1.0 && PyErr_Occurred()) { 6027db96d56Sopenharmony_ci goto exit; 6037db96d56Sopenharmony_ci } 6047db96d56Sopenharmony_ci } 6057db96d56Sopenharmony_ci if (PyFloat_CheckExact(args[1])) { 6067db96d56Sopenharmony_ci b = PyFloat_AS_DOUBLE(args[1]); 6077db96d56Sopenharmony_ci } 6087db96d56Sopenharmony_ci else 6097db96d56Sopenharmony_ci { 6107db96d56Sopenharmony_ci b = PyFloat_AsDouble(args[1]); 6117db96d56Sopenharmony_ci if (b == -1.0 && PyErr_Occurred()) { 6127db96d56Sopenharmony_ci goto exit; 6137db96d56Sopenharmony_ci } 6147db96d56Sopenharmony_ci } 6157db96d56Sopenharmony_ci if (!noptargs) { 6167db96d56Sopenharmony_ci goto skip_optional_kwonly; 6177db96d56Sopenharmony_ci } 6187db96d56Sopenharmony_ci if (args[2]) { 6197db96d56Sopenharmony_ci if (PyFloat_CheckExact(args[2])) { 6207db96d56Sopenharmony_ci rel_tol = PyFloat_AS_DOUBLE(args[2]); 6217db96d56Sopenharmony_ci } 6227db96d56Sopenharmony_ci else 6237db96d56Sopenharmony_ci { 6247db96d56Sopenharmony_ci rel_tol = PyFloat_AsDouble(args[2]); 6257db96d56Sopenharmony_ci if (rel_tol == -1.0 && PyErr_Occurred()) { 6267db96d56Sopenharmony_ci goto exit; 6277db96d56Sopenharmony_ci } 6287db96d56Sopenharmony_ci } 6297db96d56Sopenharmony_ci if (!--noptargs) { 6307db96d56Sopenharmony_ci goto skip_optional_kwonly; 6317db96d56Sopenharmony_ci } 6327db96d56Sopenharmony_ci } 6337db96d56Sopenharmony_ci if (PyFloat_CheckExact(args[3])) { 6347db96d56Sopenharmony_ci abs_tol = PyFloat_AS_DOUBLE(args[3]); 6357db96d56Sopenharmony_ci } 6367db96d56Sopenharmony_ci else 6377db96d56Sopenharmony_ci { 6387db96d56Sopenharmony_ci abs_tol = PyFloat_AsDouble(args[3]); 6397db96d56Sopenharmony_ci if (abs_tol == -1.0 && PyErr_Occurred()) { 6407db96d56Sopenharmony_ci goto exit; 6417db96d56Sopenharmony_ci } 6427db96d56Sopenharmony_ci } 6437db96d56Sopenharmony_ciskip_optional_kwonly: 6447db96d56Sopenharmony_ci _return_value = math_isclose_impl(module, a, b, rel_tol, abs_tol); 6457db96d56Sopenharmony_ci if ((_return_value == -1) && PyErr_Occurred()) { 6467db96d56Sopenharmony_ci goto exit; 6477db96d56Sopenharmony_ci } 6487db96d56Sopenharmony_ci return_value = PyBool_FromLong((long)_return_value); 6497db96d56Sopenharmony_ci 6507db96d56Sopenharmony_ciexit: 6517db96d56Sopenharmony_ci return return_value; 6527db96d56Sopenharmony_ci} 6537db96d56Sopenharmony_ci 6547db96d56Sopenharmony_ciPyDoc_STRVAR(math_prod__doc__, 6557db96d56Sopenharmony_ci"prod($module, iterable, /, *, start=1)\n" 6567db96d56Sopenharmony_ci"--\n" 6577db96d56Sopenharmony_ci"\n" 6587db96d56Sopenharmony_ci"Calculate the product of all the elements in the input iterable.\n" 6597db96d56Sopenharmony_ci"\n" 6607db96d56Sopenharmony_ci"The default start value for the product is 1.\n" 6617db96d56Sopenharmony_ci"\n" 6627db96d56Sopenharmony_ci"When the iterable is empty, return the start value. This function is\n" 6637db96d56Sopenharmony_ci"intended specifically for use with numeric values and may reject\n" 6647db96d56Sopenharmony_ci"non-numeric types."); 6657db96d56Sopenharmony_ci 6667db96d56Sopenharmony_ci#define MATH_PROD_METHODDEF \ 6677db96d56Sopenharmony_ci {"prod", _PyCFunction_CAST(math_prod), METH_FASTCALL|METH_KEYWORDS, math_prod__doc__}, 6687db96d56Sopenharmony_ci 6697db96d56Sopenharmony_cistatic PyObject * 6707db96d56Sopenharmony_cimath_prod_impl(PyObject *module, PyObject *iterable, PyObject *start); 6717db96d56Sopenharmony_ci 6727db96d56Sopenharmony_cistatic PyObject * 6737db96d56Sopenharmony_cimath_prod(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) 6747db96d56Sopenharmony_ci{ 6757db96d56Sopenharmony_ci PyObject *return_value = NULL; 6767db96d56Sopenharmony_ci static const char * const _keywords[] = {"", "start", NULL}; 6777db96d56Sopenharmony_ci static _PyArg_Parser _parser = {NULL, _keywords, "prod", 0}; 6787db96d56Sopenharmony_ci PyObject *argsbuf[2]; 6797db96d56Sopenharmony_ci Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1; 6807db96d56Sopenharmony_ci PyObject *iterable; 6817db96d56Sopenharmony_ci PyObject *start = NULL; 6827db96d56Sopenharmony_ci 6837db96d56Sopenharmony_ci args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf); 6847db96d56Sopenharmony_ci if (!args) { 6857db96d56Sopenharmony_ci goto exit; 6867db96d56Sopenharmony_ci } 6877db96d56Sopenharmony_ci iterable = args[0]; 6887db96d56Sopenharmony_ci if (!noptargs) { 6897db96d56Sopenharmony_ci goto skip_optional_kwonly; 6907db96d56Sopenharmony_ci } 6917db96d56Sopenharmony_ci start = args[1]; 6927db96d56Sopenharmony_ciskip_optional_kwonly: 6937db96d56Sopenharmony_ci return_value = math_prod_impl(module, iterable, start); 6947db96d56Sopenharmony_ci 6957db96d56Sopenharmony_ciexit: 6967db96d56Sopenharmony_ci return return_value; 6977db96d56Sopenharmony_ci} 6987db96d56Sopenharmony_ci 6997db96d56Sopenharmony_ciPyDoc_STRVAR(math_perm__doc__, 7007db96d56Sopenharmony_ci"perm($module, n, k=None, /)\n" 7017db96d56Sopenharmony_ci"--\n" 7027db96d56Sopenharmony_ci"\n" 7037db96d56Sopenharmony_ci"Number of ways to choose k items from n items without repetition and with order.\n" 7047db96d56Sopenharmony_ci"\n" 7057db96d56Sopenharmony_ci"Evaluates to n! / (n - k)! when k <= n and evaluates\n" 7067db96d56Sopenharmony_ci"to zero when k > n.\n" 7077db96d56Sopenharmony_ci"\n" 7087db96d56Sopenharmony_ci"If k is not specified or is None, then k defaults to n\n" 7097db96d56Sopenharmony_ci"and the function returns n!.\n" 7107db96d56Sopenharmony_ci"\n" 7117db96d56Sopenharmony_ci"Raises TypeError if either of the arguments are not integers.\n" 7127db96d56Sopenharmony_ci"Raises ValueError if either of the arguments are negative."); 7137db96d56Sopenharmony_ci 7147db96d56Sopenharmony_ci#define MATH_PERM_METHODDEF \ 7157db96d56Sopenharmony_ci {"perm", _PyCFunction_CAST(math_perm), METH_FASTCALL, math_perm__doc__}, 7167db96d56Sopenharmony_ci 7177db96d56Sopenharmony_cistatic PyObject * 7187db96d56Sopenharmony_cimath_perm_impl(PyObject *module, PyObject *n, PyObject *k); 7197db96d56Sopenharmony_ci 7207db96d56Sopenharmony_cistatic PyObject * 7217db96d56Sopenharmony_cimath_perm(PyObject *module, PyObject *const *args, Py_ssize_t nargs) 7227db96d56Sopenharmony_ci{ 7237db96d56Sopenharmony_ci PyObject *return_value = NULL; 7247db96d56Sopenharmony_ci PyObject *n; 7257db96d56Sopenharmony_ci PyObject *k = Py_None; 7267db96d56Sopenharmony_ci 7277db96d56Sopenharmony_ci if (!_PyArg_CheckPositional("perm", nargs, 1, 2)) { 7287db96d56Sopenharmony_ci goto exit; 7297db96d56Sopenharmony_ci } 7307db96d56Sopenharmony_ci n = args[0]; 7317db96d56Sopenharmony_ci if (nargs < 2) { 7327db96d56Sopenharmony_ci goto skip_optional; 7337db96d56Sopenharmony_ci } 7347db96d56Sopenharmony_ci k = args[1]; 7357db96d56Sopenharmony_ciskip_optional: 7367db96d56Sopenharmony_ci return_value = math_perm_impl(module, n, k); 7377db96d56Sopenharmony_ci 7387db96d56Sopenharmony_ciexit: 7397db96d56Sopenharmony_ci return return_value; 7407db96d56Sopenharmony_ci} 7417db96d56Sopenharmony_ci 7427db96d56Sopenharmony_ciPyDoc_STRVAR(math_comb__doc__, 7437db96d56Sopenharmony_ci"comb($module, n, k, /)\n" 7447db96d56Sopenharmony_ci"--\n" 7457db96d56Sopenharmony_ci"\n" 7467db96d56Sopenharmony_ci"Number of ways to choose k items from n items without repetition and without order.\n" 7477db96d56Sopenharmony_ci"\n" 7487db96d56Sopenharmony_ci"Evaluates to n! / (k! * (n - k)!) when k <= n and evaluates\n" 7497db96d56Sopenharmony_ci"to zero when k > n.\n" 7507db96d56Sopenharmony_ci"\n" 7517db96d56Sopenharmony_ci"Also called the binomial coefficient because it is equivalent\n" 7527db96d56Sopenharmony_ci"to the coefficient of k-th term in polynomial expansion of the\n" 7537db96d56Sopenharmony_ci"expression (1 + x)**n.\n" 7547db96d56Sopenharmony_ci"\n" 7557db96d56Sopenharmony_ci"Raises TypeError if either of the arguments are not integers.\n" 7567db96d56Sopenharmony_ci"Raises ValueError if either of the arguments are negative."); 7577db96d56Sopenharmony_ci 7587db96d56Sopenharmony_ci#define MATH_COMB_METHODDEF \ 7597db96d56Sopenharmony_ci {"comb", _PyCFunction_CAST(math_comb), METH_FASTCALL, math_comb__doc__}, 7607db96d56Sopenharmony_ci 7617db96d56Sopenharmony_cistatic PyObject * 7627db96d56Sopenharmony_cimath_comb_impl(PyObject *module, PyObject *n, PyObject *k); 7637db96d56Sopenharmony_ci 7647db96d56Sopenharmony_cistatic PyObject * 7657db96d56Sopenharmony_cimath_comb(PyObject *module, PyObject *const *args, Py_ssize_t nargs) 7667db96d56Sopenharmony_ci{ 7677db96d56Sopenharmony_ci PyObject *return_value = NULL; 7687db96d56Sopenharmony_ci PyObject *n; 7697db96d56Sopenharmony_ci PyObject *k; 7707db96d56Sopenharmony_ci 7717db96d56Sopenharmony_ci if (!_PyArg_CheckPositional("comb", nargs, 2, 2)) { 7727db96d56Sopenharmony_ci goto exit; 7737db96d56Sopenharmony_ci } 7747db96d56Sopenharmony_ci n = args[0]; 7757db96d56Sopenharmony_ci k = args[1]; 7767db96d56Sopenharmony_ci return_value = math_comb_impl(module, n, k); 7777db96d56Sopenharmony_ci 7787db96d56Sopenharmony_ciexit: 7797db96d56Sopenharmony_ci return return_value; 7807db96d56Sopenharmony_ci} 7817db96d56Sopenharmony_ci 7827db96d56Sopenharmony_ciPyDoc_STRVAR(math_nextafter__doc__, 7837db96d56Sopenharmony_ci"nextafter($module, x, y, /)\n" 7847db96d56Sopenharmony_ci"--\n" 7857db96d56Sopenharmony_ci"\n" 7867db96d56Sopenharmony_ci"Return the next floating-point value after x towards y."); 7877db96d56Sopenharmony_ci 7887db96d56Sopenharmony_ci#define MATH_NEXTAFTER_METHODDEF \ 7897db96d56Sopenharmony_ci {"nextafter", _PyCFunction_CAST(math_nextafter), METH_FASTCALL, math_nextafter__doc__}, 7907db96d56Sopenharmony_ci 7917db96d56Sopenharmony_cistatic PyObject * 7927db96d56Sopenharmony_cimath_nextafter_impl(PyObject *module, double x, double y); 7937db96d56Sopenharmony_ci 7947db96d56Sopenharmony_cistatic PyObject * 7957db96d56Sopenharmony_cimath_nextafter(PyObject *module, PyObject *const *args, Py_ssize_t nargs) 7967db96d56Sopenharmony_ci{ 7977db96d56Sopenharmony_ci PyObject *return_value = NULL; 7987db96d56Sopenharmony_ci double x; 7997db96d56Sopenharmony_ci double y; 8007db96d56Sopenharmony_ci 8017db96d56Sopenharmony_ci if (!_PyArg_CheckPositional("nextafter", nargs, 2, 2)) { 8027db96d56Sopenharmony_ci goto exit; 8037db96d56Sopenharmony_ci } 8047db96d56Sopenharmony_ci if (PyFloat_CheckExact(args[0])) { 8057db96d56Sopenharmony_ci x = PyFloat_AS_DOUBLE(args[0]); 8067db96d56Sopenharmony_ci } 8077db96d56Sopenharmony_ci else 8087db96d56Sopenharmony_ci { 8097db96d56Sopenharmony_ci x = PyFloat_AsDouble(args[0]); 8107db96d56Sopenharmony_ci if (x == -1.0 && PyErr_Occurred()) { 8117db96d56Sopenharmony_ci goto exit; 8127db96d56Sopenharmony_ci } 8137db96d56Sopenharmony_ci } 8147db96d56Sopenharmony_ci if (PyFloat_CheckExact(args[1])) { 8157db96d56Sopenharmony_ci y = PyFloat_AS_DOUBLE(args[1]); 8167db96d56Sopenharmony_ci } 8177db96d56Sopenharmony_ci else 8187db96d56Sopenharmony_ci { 8197db96d56Sopenharmony_ci y = PyFloat_AsDouble(args[1]); 8207db96d56Sopenharmony_ci if (y == -1.0 && PyErr_Occurred()) { 8217db96d56Sopenharmony_ci goto exit; 8227db96d56Sopenharmony_ci } 8237db96d56Sopenharmony_ci } 8247db96d56Sopenharmony_ci return_value = math_nextafter_impl(module, x, y); 8257db96d56Sopenharmony_ci 8267db96d56Sopenharmony_ciexit: 8277db96d56Sopenharmony_ci return return_value; 8287db96d56Sopenharmony_ci} 8297db96d56Sopenharmony_ci 8307db96d56Sopenharmony_ciPyDoc_STRVAR(math_ulp__doc__, 8317db96d56Sopenharmony_ci"ulp($module, x, /)\n" 8327db96d56Sopenharmony_ci"--\n" 8337db96d56Sopenharmony_ci"\n" 8347db96d56Sopenharmony_ci"Return the value of the least significant bit of the float x."); 8357db96d56Sopenharmony_ci 8367db96d56Sopenharmony_ci#define MATH_ULP_METHODDEF \ 8377db96d56Sopenharmony_ci {"ulp", (PyCFunction)math_ulp, METH_O, math_ulp__doc__}, 8387db96d56Sopenharmony_ci 8397db96d56Sopenharmony_cistatic double 8407db96d56Sopenharmony_cimath_ulp_impl(PyObject *module, double x); 8417db96d56Sopenharmony_ci 8427db96d56Sopenharmony_cistatic PyObject * 8437db96d56Sopenharmony_cimath_ulp(PyObject *module, PyObject *arg) 8447db96d56Sopenharmony_ci{ 8457db96d56Sopenharmony_ci PyObject *return_value = NULL; 8467db96d56Sopenharmony_ci double x; 8477db96d56Sopenharmony_ci double _return_value; 8487db96d56Sopenharmony_ci 8497db96d56Sopenharmony_ci if (PyFloat_CheckExact(arg)) { 8507db96d56Sopenharmony_ci x = PyFloat_AS_DOUBLE(arg); 8517db96d56Sopenharmony_ci } 8527db96d56Sopenharmony_ci else 8537db96d56Sopenharmony_ci { 8547db96d56Sopenharmony_ci x = PyFloat_AsDouble(arg); 8557db96d56Sopenharmony_ci if (x == -1.0 && PyErr_Occurred()) { 8567db96d56Sopenharmony_ci goto exit; 8577db96d56Sopenharmony_ci } 8587db96d56Sopenharmony_ci } 8597db96d56Sopenharmony_ci _return_value = math_ulp_impl(module, x); 8607db96d56Sopenharmony_ci if ((_return_value == -1.0) && PyErr_Occurred()) { 8617db96d56Sopenharmony_ci goto exit; 8627db96d56Sopenharmony_ci } 8637db96d56Sopenharmony_ci return_value = PyFloat_FromDouble(_return_value); 8647db96d56Sopenharmony_ci 8657db96d56Sopenharmony_ciexit: 8667db96d56Sopenharmony_ci return return_value; 8677db96d56Sopenharmony_ci} 8687db96d56Sopenharmony_ci/*[clinic end generated code: output=965f99dabaa72165 input=a9049054013a1b77]*/ 869