| /*[clinic input] | |
| preserve | |
| [clinic start generated code]*/ | |
| #if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE) | |
| # include "pycore_gc.h" // PyGC_Head | |
| # include "pycore_runtime.h" // _Py_ID() | |
| #endif | |
| #include "pycore_modsupport.h" // _PyArg_CheckPositional() | |
| PyDoc_STRVAR(math_ceil__doc__, | |
| "ceil($module, x, /)\n" | |
| "--\n" | |
| "\n" | |
| "Return the ceiling of x as an Integral.\n" | |
| "\n" | |
| "This is the smallest integer >= x."); | |
| #define MATH_CEIL_METHODDEF \ | |
| {"ceil", (PyCFunction)math_ceil, METH_O, math_ceil__doc__}, | |
| PyDoc_STRVAR(math_floor__doc__, | |
| "floor($module, x, /)\n" | |
| "--\n" | |
| "\n" | |
| "Return the floor of x as an Integral.\n" | |
| "\n" | |
| "This is the largest integer <= x."); | |
| #define MATH_FLOOR_METHODDEF \ | |
| {"floor", (PyCFunction)math_floor, METH_O, math_floor__doc__}, | |
| PyDoc_STRVAR(math_fmax__doc__, | |
| "fmax($module, x, y, /)\n" | |
| "--\n" | |
| "\n" | |
| "Return the larger of two floating-point arguments."); | |
| #define MATH_FMAX_METHODDEF \ | |
| {"fmax", _PyCFunction_CAST(math_fmax), METH_FASTCALL, math_fmax__doc__}, | |
| static double | |
| math_fmax_impl(PyObject *module, double x, double y); | |
| static PyObject * | |
| math_fmax(PyObject *module, PyObject *const *args, Py_ssize_t nargs) | |
| { | |
| PyObject *return_value = NULL; | |
| double x; | |
| double y; | |
| double _return_value; | |
| if (!_PyArg_CheckPositional("fmax", nargs, 2, 2)) { | |
| goto exit; | |
| } | |
| if (PyFloat_CheckExact(args[0])) { | |
| x = PyFloat_AS_DOUBLE(args[0]); | |
| } | |
| else | |
| { | |
| x = PyFloat_AsDouble(args[0]); | |
| if (x == -1.0 && PyErr_Occurred()) { | |
| goto exit; | |
| } | |
| } | |
| if (PyFloat_CheckExact(args[1])) { | |
| y = PyFloat_AS_DOUBLE(args[1]); | |
| } | |
| else | |
| { | |
| y = PyFloat_AsDouble(args[1]); | |
| if (y == -1.0 && PyErr_Occurred()) { | |
| goto exit; | |
| } | |
| } | |
| _return_value = math_fmax_impl(module, x, y); | |
| if ((_return_value == -1.0) && PyErr_Occurred()) { | |
| goto exit; | |
| } | |
| return_value = PyFloat_FromDouble(_return_value); | |
| exit: | |
| return return_value; | |
| } | |
| PyDoc_STRVAR(math_fmin__doc__, | |
| "fmin($module, x, y, /)\n" | |
| "--\n" | |
| "\n" | |
| "Return the smaller of two floating-point arguments."); | |
| #define MATH_FMIN_METHODDEF \ | |
| {"fmin", _PyCFunction_CAST(math_fmin), METH_FASTCALL, math_fmin__doc__}, | |
| static double | |
| math_fmin_impl(PyObject *module, double x, double y); | |
| static PyObject * | |
| math_fmin(PyObject *module, PyObject *const *args, Py_ssize_t nargs) | |
| { | |
| PyObject *return_value = NULL; | |
| double x; | |
| double y; | |
| double _return_value; | |
| if (!_PyArg_CheckPositional("fmin", nargs, 2, 2)) { | |
| goto exit; | |
| } | |
| if (PyFloat_CheckExact(args[0])) { | |
| x = PyFloat_AS_DOUBLE(args[0]); | |
| } | |
| else | |
| { | |
| x = PyFloat_AsDouble(args[0]); | |
| if (x == -1.0 && PyErr_Occurred()) { | |
| goto exit; | |
| } | |
| } | |
| if (PyFloat_CheckExact(args[1])) { | |
| y = PyFloat_AS_DOUBLE(args[1]); | |
| } | |
| else | |
| { | |
| y = PyFloat_AsDouble(args[1]); | |
| if (y == -1.0 && PyErr_Occurred()) { | |
| goto exit; | |
| } | |
| } | |
| _return_value = math_fmin_impl(module, x, y); | |
| if ((_return_value == -1.0) && PyErr_Occurred()) { | |
| goto exit; | |
| } | |
| return_value = PyFloat_FromDouble(_return_value); | |
| exit: | |
| return return_value; | |
| } | |
| PyDoc_STRVAR(math_signbit__doc__, | |
| "signbit($module, x, /)\n" | |
| "--\n" | |
| "\n" | |
| "Return True if the sign of x is negative and False otherwise."); | |
| #define MATH_SIGNBIT_METHODDEF \ | |
| {"signbit", (PyCFunction)math_signbit, METH_O, math_signbit__doc__}, | |
| static PyObject * | |
| math_signbit_impl(PyObject *module, double x); | |
| static PyObject * | |
| math_signbit(PyObject *module, PyObject *arg) | |
| { | |
| PyObject *return_value = NULL; | |
| double x; | |
| if (PyFloat_CheckExact(arg)) { | |
| x = PyFloat_AS_DOUBLE(arg); | |
| } | |
| else | |
| { | |
| x = PyFloat_AsDouble(arg); | |
| if (x == -1.0 && PyErr_Occurred()) { | |
| goto exit; | |
| } | |
| } | |
| return_value = math_signbit_impl(module, x); | |
| exit: | |
| return return_value; | |
| } | |
| PyDoc_STRVAR(math_fsum__doc__, | |
| "fsum($module, seq, /)\n" | |
| "--\n" | |
| "\n" | |
| "Return an accurate floating-point sum of values in the iterable seq.\n" | |
| "\n" | |
| "Assumes IEEE-754 floating-point arithmetic."); | |
| #define MATH_FSUM_METHODDEF \ | |
| {"fsum", (PyCFunction)math_fsum, METH_O, math_fsum__doc__}, | |
| PyDoc_STRVAR(math_trunc__doc__, | |
| "trunc($module, x, /)\n" | |
| "--\n" | |
| "\n" | |
| "Truncates the Real x to the nearest Integral toward 0.\n" | |
| "\n" | |
| "Uses the __trunc__ magic method."); | |
| #define MATH_TRUNC_METHODDEF \ | |
| {"trunc", (PyCFunction)math_trunc, METH_O, math_trunc__doc__}, | |
| PyDoc_STRVAR(math_frexp__doc__, | |
| "frexp($module, x, /)\n" | |
| "--\n" | |
| "\n" | |
| "Return the mantissa and exponent of x, as pair (m, e).\n" | |
| "\n" | |
| "If x is a finite nonzero number, then m is a float with\n" | |
| "0.5 <= abs(m) < 1.0 and an integer e is such that\n" | |
| "x == m * 2**e exactly. Else, return (x, 0)."); | |
| #define MATH_FREXP_METHODDEF \ | |
| {"frexp", (PyCFunction)math_frexp, METH_O, math_frexp__doc__}, | |
| static PyObject * | |
| math_frexp_impl(PyObject *module, double x); | |
| static PyObject * | |
| math_frexp(PyObject *module, PyObject *arg) | |
| { | |
| PyObject *return_value = NULL; | |
| double x; | |
| if (PyFloat_CheckExact(arg)) { | |
| x = PyFloat_AS_DOUBLE(arg); | |
| } | |
| else | |
| { | |
| x = PyFloat_AsDouble(arg); | |
| if (x == -1.0 && PyErr_Occurred()) { | |
| goto exit; | |
| } | |
| } | |
| return_value = math_frexp_impl(module, x); | |
| exit: | |
| return return_value; | |
| } | |
| PyDoc_STRVAR(math_ldexp__doc__, | |
| "ldexp($module, x, i, /)\n" | |
| "--\n" | |
| "\n" | |
| "Return x * (2**i).\n" | |
| "\n" | |
| "This is essentially the inverse of frexp()."); | |
| #define MATH_LDEXP_METHODDEF \ | |
| {"ldexp", _PyCFunction_CAST(math_ldexp), METH_FASTCALL, math_ldexp__doc__}, | |
| static PyObject * | |
| math_ldexp_impl(PyObject *module, double x, PyObject *i); | |
| static PyObject * | |
| math_ldexp(PyObject *module, PyObject *const *args, Py_ssize_t nargs) | |
| { | |
| PyObject *return_value = NULL; | |
| double x; | |
| PyObject *i; | |
| if (!_PyArg_CheckPositional("ldexp", nargs, 2, 2)) { | |
| goto exit; | |
| } | |
| if (PyFloat_CheckExact(args[0])) { | |
| x = PyFloat_AS_DOUBLE(args[0]); | |
| } | |
| else | |
| { | |
| x = PyFloat_AsDouble(args[0]); | |
| if (x == -1.0 && PyErr_Occurred()) { | |
| goto exit; | |
| } | |
| } | |
| i = args[1]; | |
| return_value = math_ldexp_impl(module, x, i); | |
| exit: | |
| return return_value; | |
| } | |
| PyDoc_STRVAR(math_modf__doc__, | |
| "modf($module, x, /)\n" | |
| "--\n" | |
| "\n" | |
| "Return the fractional and integer parts of x.\n" | |
| "\n" | |
| "Both results carry the sign of x and are floats."); | |
| #define MATH_MODF_METHODDEF \ | |
| {"modf", (PyCFunction)math_modf, METH_O, math_modf__doc__}, | |
| static PyObject * | |
| math_modf_impl(PyObject *module, double x); | |
| static PyObject * | |
| math_modf(PyObject *module, PyObject *arg) | |
| { | |
| PyObject *return_value = NULL; | |
| double x; | |
| if (PyFloat_CheckExact(arg)) { | |
| x = PyFloat_AS_DOUBLE(arg); | |
| } | |
| else | |
| { | |
| x = PyFloat_AsDouble(arg); | |
| if (x == -1.0 && PyErr_Occurred()) { | |
| goto exit; | |
| } | |
| } | |
| return_value = math_modf_impl(module, x); | |
| exit: | |
| return return_value; | |
| } | |
| PyDoc_STRVAR(math_log2__doc__, | |
| "log2($module, x, /)\n" | |
| "--\n" | |
| "\n" | |
| "Return the base 2 logarithm of x."); | |
| #define MATH_LOG2_METHODDEF \ | |
| {"log2", (PyCFunction)math_log2, METH_O, math_log2__doc__}, | |
| PyDoc_STRVAR(math_log10__doc__, | |
| "log10($module, x, /)\n" | |
| "--\n" | |
| "\n" | |
| "Return the base 10 logarithm of x."); | |
| #define MATH_LOG10_METHODDEF \ | |
| {"log10", (PyCFunction)math_log10, METH_O, math_log10__doc__}, | |
| PyDoc_STRVAR(math_fma__doc__, | |
| "fma($module, x, y, z, /)\n" | |
| "--\n" | |
| "\n" | |
| "Fused multiply-add operation.\n" | |
| "\n" | |
| "Compute (x * y) + z with a single round."); | |
| #define MATH_FMA_METHODDEF \ | |
| {"fma", _PyCFunction_CAST(math_fma), METH_FASTCALL, math_fma__doc__}, | |
| static PyObject * | |
| math_fma_impl(PyObject *module, double x, double y, double z); | |
| static PyObject * | |
| math_fma(PyObject *module, PyObject *const *args, Py_ssize_t nargs) | |
| { | |
| PyObject *return_value = NULL; | |
| double x; | |
| double y; | |
| double z; | |
| if (!_PyArg_CheckPositional("fma", nargs, 3, 3)) { | |
| goto exit; | |
| } | |
| if (PyFloat_CheckExact(args[0])) { | |
| x = PyFloat_AS_DOUBLE(args[0]); | |
| } | |
| else | |
| { | |
| x = PyFloat_AsDouble(args[0]); | |
| if (x == -1.0 && PyErr_Occurred()) { | |
| goto exit; | |
| } | |
| } | |
| if (PyFloat_CheckExact(args[1])) { | |
| y = PyFloat_AS_DOUBLE(args[1]); | |
| } | |
| else | |
| { | |
| y = PyFloat_AsDouble(args[1]); | |
| if (y == -1.0 && PyErr_Occurred()) { | |
| goto exit; | |
| } | |
| } | |
| if (PyFloat_CheckExact(args[2])) { | |
| z = PyFloat_AS_DOUBLE(args[2]); | |
| } | |
| else | |
| { | |
| z = PyFloat_AsDouble(args[2]); | |
| if (z == -1.0 && PyErr_Occurred()) { | |
| goto exit; | |
| } | |
| } | |
| return_value = math_fma_impl(module, x, y, z); | |
| exit: | |
| return return_value; | |
| } | |
| PyDoc_STRVAR(math_fmod__doc__, | |
| "fmod($module, x, y, /)\n" | |
| "--\n" | |
| "\n" | |
| "Return fmod(x, y), according to platform C.\n" | |
| "\n" | |
| "x % y may differ."); | |
| #define MATH_FMOD_METHODDEF \ | |
| {"fmod", _PyCFunction_CAST(math_fmod), METH_FASTCALL, math_fmod__doc__}, | |
| static PyObject * | |
| math_fmod_impl(PyObject *module, double x, double y); | |
| static PyObject * | |
| math_fmod(PyObject *module, PyObject *const *args, Py_ssize_t nargs) | |
| { | |
| PyObject *return_value = NULL; | |
| double x; | |
| double y; | |
| if (!_PyArg_CheckPositional("fmod", nargs, 2, 2)) { | |
| goto exit; | |
| } | |
| if (PyFloat_CheckExact(args[0])) { | |
| x = PyFloat_AS_DOUBLE(args[0]); | |
| } | |
| else | |
| { | |
| x = PyFloat_AsDouble(args[0]); | |
| if (x == -1.0 && PyErr_Occurred()) { | |
| goto exit; | |
| } | |
| } | |
| if (PyFloat_CheckExact(args[1])) { | |
| y = PyFloat_AS_DOUBLE(args[1]); | |
| } | |
| else | |
| { | |
| y = PyFloat_AsDouble(args[1]); | |
| if (y == -1.0 && PyErr_Occurred()) { | |
| goto exit; | |
| } | |
| } | |
| return_value = math_fmod_impl(module, x, y); | |
| exit: | |
| return return_value; | |
| } | |
| PyDoc_STRVAR(math_dist__doc__, | |
| "dist($module, p, q, /)\n" | |
| "--\n" | |
| "\n" | |
| "Return the Euclidean distance between two points p and q.\n" | |
| "\n" | |
| "The points should be specified as sequences (or iterables) of\n" | |
| "coordinates. Both inputs must have the same dimension.\n" | |
| "\n" | |
| "Roughly equivalent to:\n" | |
| " sqrt(sum((px - qx) ** 2.0 for px, qx in zip(p, q)))"); | |
| #define MATH_DIST_METHODDEF \ | |
| {"dist", _PyCFunction_CAST(math_dist), METH_FASTCALL, math_dist__doc__}, | |
| static PyObject * | |
| math_dist_impl(PyObject *module, PyObject *p, PyObject *q); | |
| static PyObject * | |
| math_dist(PyObject *module, PyObject *const *args, Py_ssize_t nargs) | |
| { | |
| PyObject *return_value = NULL; | |
| PyObject *p; | |
| PyObject *q; | |
| if (!_PyArg_CheckPositional("dist", nargs, 2, 2)) { | |
| goto exit; | |
| } | |
| p = args[0]; | |
| q = args[1]; | |
| return_value = math_dist_impl(module, p, q); | |
| exit: | |
| return return_value; | |
| } | |
| PyDoc_STRVAR(math_hypot__doc__, | |
| "hypot($module, /, *coordinates)\n" | |
| "--\n" | |
| "\n" | |
| "Multidimensional Euclidean distance from the origin to a point.\n" | |
| "\n" | |
| "Roughly equivalent to:\n" | |
| " sqrt(sum(x**2 for x in coordinates))\n" | |
| "\n" | |
| "For a two dimensional point (x, y), gives the hypotenuse\n" | |
| "using the Pythagorean theorem: sqrt(x*x + y*y).\n" | |
| "\n" | |
| "For example, the hypotenuse of a 3/4/5 right triangle is:\n" | |
| "\n" | |
| " >>> hypot(3.0, 4.0)\n" | |
| " 5.0"); | |
| #define MATH_HYPOT_METHODDEF \ | |
| {"hypot", _PyCFunction_CAST(math_hypot), METH_FASTCALL, math_hypot__doc__}, | |
| static PyObject * | |
| math_hypot_impl(PyObject *module, PyObject * const *args, | |
| Py_ssize_t args_length); | |
| static PyObject * | |
| math_hypot(PyObject *module, PyObject *const *args, Py_ssize_t nargs) | |
| { | |
| PyObject *return_value = NULL; | |
| PyObject * const *__clinic_args; | |
| Py_ssize_t args_length; | |
| __clinic_args = args; | |
| args_length = nargs; | |
| return_value = math_hypot_impl(module, __clinic_args, args_length); | |
| return return_value; | |
| } | |
| PyDoc_STRVAR(math_sumprod__doc__, | |
| "sumprod($module, p, q, /)\n" | |
| "--\n" | |
| "\n" | |
| "Return the sum of products of values from two iterables p and q.\n" | |
| "\n" | |
| "Roughly equivalent to:\n" | |
| "\n" | |
| " sum(map(operator.mul, p, q, strict=True))\n" | |
| "\n" | |
| "For float and mixed int/float inputs, the intermediate products\n" | |
| "and sums are computed with extended precision."); | |
| #define MATH_SUMPROD_METHODDEF \ | |
| {"sumprod", _PyCFunction_CAST(math_sumprod), METH_FASTCALL, math_sumprod__doc__}, | |
| static PyObject * | |
| math_sumprod_impl(PyObject *module, PyObject *p, PyObject *q); | |
| static PyObject * | |
| math_sumprod(PyObject *module, PyObject *const *args, Py_ssize_t nargs) | |
| { | |
| PyObject *return_value = NULL; | |
| PyObject *p; | |
| PyObject *q; | |
| if (!_PyArg_CheckPositional("sumprod", nargs, 2, 2)) { | |
| goto exit; | |
| } | |
| p = args[0]; | |
| q = args[1]; | |
| return_value = math_sumprod_impl(module, p, q); | |
| exit: | |
| return return_value; | |
| } | |
| PyDoc_STRVAR(math_pow__doc__, | |
| "pow($module, x, y, /)\n" | |
| "--\n" | |
| "\n" | |
| "Return x**y (x to the power of y)."); | |
| #define MATH_POW_METHODDEF \ | |
| {"pow", _PyCFunction_CAST(math_pow), METH_FASTCALL, math_pow__doc__}, | |
| static PyObject * | |
| math_pow_impl(PyObject *module, double x, double y); | |
| static PyObject * | |
| math_pow(PyObject *module, PyObject *const *args, Py_ssize_t nargs) | |
| { | |
| PyObject *return_value = NULL; | |
| double x; | |
| double y; | |
| if (!_PyArg_CheckPositional("pow", nargs, 2, 2)) { | |
| goto exit; | |
| } | |
| if (PyFloat_CheckExact(args[0])) { | |
| x = PyFloat_AS_DOUBLE(args[0]); | |
| } | |
| else | |
| { | |
| x = PyFloat_AsDouble(args[0]); | |
| if (x == -1.0 && PyErr_Occurred()) { | |
| goto exit; | |
| } | |
| } | |
| if (PyFloat_CheckExact(args[1])) { | |
| y = PyFloat_AS_DOUBLE(args[1]); | |
| } | |
| else | |
| { | |
| y = PyFloat_AsDouble(args[1]); | |
| if (y == -1.0 && PyErr_Occurred()) { | |
| goto exit; | |
| } | |
| } | |
| return_value = math_pow_impl(module, x, y); | |
| exit: | |
| return return_value; | |
| } | |
| PyDoc_STRVAR(math_degrees__doc__, | |
| "degrees($module, x, /)\n" | |
| "--\n" | |
| "\n" | |
| "Convert angle x from radians to degrees."); | |
| #define MATH_DEGREES_METHODDEF \ | |
| {"degrees", (PyCFunction)math_degrees, METH_O, math_degrees__doc__}, | |
| static PyObject * | |
| math_degrees_impl(PyObject *module, double x); | |
| static PyObject * | |
| math_degrees(PyObject *module, PyObject *arg) | |
| { | |
| PyObject *return_value = NULL; | |
| double x; | |
| if (PyFloat_CheckExact(arg)) { | |
| x = PyFloat_AS_DOUBLE(arg); | |
| } | |
| else | |
| { | |
| x = PyFloat_AsDouble(arg); | |
| if (x == -1.0 && PyErr_Occurred()) { | |
| goto exit; | |
| } | |
| } | |
| return_value = math_degrees_impl(module, x); | |
| exit: | |
| return return_value; | |
| } | |
| PyDoc_STRVAR(math_radians__doc__, | |
| "radians($module, x, /)\n" | |
| "--\n" | |
| "\n" | |
| "Convert angle x from degrees to radians."); | |
| #define MATH_RADIANS_METHODDEF \ | |
| {"radians", (PyCFunction)math_radians, METH_O, math_radians__doc__}, | |
| static PyObject * | |
| math_radians_impl(PyObject *module, double x); | |
| static PyObject * | |
| math_radians(PyObject *module, PyObject *arg) | |
| { | |
| PyObject *return_value = NULL; | |
| double x; | |
| if (PyFloat_CheckExact(arg)) { | |
| x = PyFloat_AS_DOUBLE(arg); | |
| } | |
| else | |
| { | |
| x = PyFloat_AsDouble(arg); | |
| if (x == -1.0 && PyErr_Occurred()) { | |
| goto exit; | |
| } | |
| } | |
| return_value = math_radians_impl(module, x); | |
| exit: | |
| return return_value; | |
| } | |
| PyDoc_STRVAR(math_isfinite__doc__, | |
| "isfinite($module, x, /)\n" | |
| "--\n" | |
| "\n" | |
| "Return True if x is neither an infinity nor a NaN, and False otherwise."); | |
| #define MATH_ISFINITE_METHODDEF \ | |
| {"isfinite", (PyCFunction)math_isfinite, METH_O, math_isfinite__doc__}, | |
| static PyObject * | |
| math_isfinite_impl(PyObject *module, double x); | |
| static PyObject * | |
| math_isfinite(PyObject *module, PyObject *arg) | |
| { | |
| PyObject *return_value = NULL; | |
| double x; | |
| if (PyFloat_CheckExact(arg)) { | |
| x = PyFloat_AS_DOUBLE(arg); | |
| } | |
| else | |
| { | |
| x = PyFloat_AsDouble(arg); | |
| if (x == -1.0 && PyErr_Occurred()) { | |
| goto exit; | |
| } | |
| } | |
| return_value = math_isfinite_impl(module, x); | |
| exit: | |
| return return_value; | |
| } | |
| PyDoc_STRVAR(math_isnormal__doc__, | |
| "isnormal($module, x, /)\n" | |
| "--\n" | |
| "\n" | |
| "Return True if x is normal, and False otherwise."); | |
| #define MATH_ISNORMAL_METHODDEF \ | |
| {"isnormal", (PyCFunction)math_isnormal, METH_O, math_isnormal__doc__}, | |
| static PyObject * | |
| math_isnormal_impl(PyObject *module, double x); | |
| static PyObject * | |
| math_isnormal(PyObject *module, PyObject *arg) | |
| { | |
| PyObject *return_value = NULL; | |
| double x; | |
| if (PyFloat_CheckExact(arg)) { | |
| x = PyFloat_AS_DOUBLE(arg); | |
| } | |
| else | |
| { | |
| x = PyFloat_AsDouble(arg); | |
| if (x == -1.0 && PyErr_Occurred()) { | |
| goto exit; | |
| } | |
| } | |
| return_value = math_isnormal_impl(module, x); | |
| exit: | |
| return return_value; | |
| } | |
| PyDoc_STRVAR(math_issubnormal__doc__, | |
| "issubnormal($module, x, /)\n" | |
| "--\n" | |
| "\n" | |
| "Return True if x is subnormal, and False otherwise."); | |
| #define MATH_ISSUBNORMAL_METHODDEF \ | |
| {"issubnormal", (PyCFunction)math_issubnormal, METH_O, math_issubnormal__doc__}, | |
| static PyObject * | |
| math_issubnormal_impl(PyObject *module, double x); | |
| static PyObject * | |
| math_issubnormal(PyObject *module, PyObject *arg) | |
| { | |
| PyObject *return_value = NULL; | |
| double x; | |
| if (PyFloat_CheckExact(arg)) { | |
| x = PyFloat_AS_DOUBLE(arg); | |
| } | |
| else | |
| { | |
| x = PyFloat_AsDouble(arg); | |
| if (x == -1.0 && PyErr_Occurred()) { | |
| goto exit; | |
| } | |
| } | |
| return_value = math_issubnormal_impl(module, x); | |
| exit: | |
| return return_value; | |
| } | |
| PyDoc_STRVAR(math_isnan__doc__, | |
| "isnan($module, x, /)\n" | |
| "--\n" | |
| "\n" | |
| "Return True if x is a NaN (not a number), and False otherwise."); | |
| #define MATH_ISNAN_METHODDEF \ | |
| {"isnan", (PyCFunction)math_isnan, METH_O, math_isnan__doc__}, | |
| static PyObject * | |
| math_isnan_impl(PyObject *module, double x); | |
| static PyObject * | |
| math_isnan(PyObject *module, PyObject *arg) | |
| { | |
| PyObject *return_value = NULL; | |
| double x; | |
| if (PyFloat_CheckExact(arg)) { | |
| x = PyFloat_AS_DOUBLE(arg); | |
| } | |
| else | |
| { | |
| x = PyFloat_AsDouble(arg); | |
| if (x == -1.0 && PyErr_Occurred()) { | |
| goto exit; | |
| } | |
| } | |
| return_value = math_isnan_impl(module, x); | |
| exit: | |
| return return_value; | |
| } | |
| PyDoc_STRVAR(math_isinf__doc__, | |
| "isinf($module, x, /)\n" | |
| "--\n" | |
| "\n" | |
| "Return True if x is a positive or negative infinity, and False otherwise."); | |
| #define MATH_ISINF_METHODDEF \ | |
| {"isinf", (PyCFunction)math_isinf, METH_O, math_isinf__doc__}, | |
| static PyObject * | |
| math_isinf_impl(PyObject *module, double x); | |
| static PyObject * | |
| math_isinf(PyObject *module, PyObject *arg) | |
| { | |
| PyObject *return_value = NULL; | |
| double x; | |
| if (PyFloat_CheckExact(arg)) { | |
| x = PyFloat_AS_DOUBLE(arg); | |
| } | |
| else | |
| { | |
| x = PyFloat_AsDouble(arg); | |
| if (x == -1.0 && PyErr_Occurred()) { | |
| goto exit; | |
| } | |
| } | |
| return_value = math_isinf_impl(module, x); | |
| exit: | |
| return return_value; | |
| } | |
| PyDoc_STRVAR(math_isclose__doc__, | |
| "isclose($module, /, a, b, *, rel_tol=1e-09, abs_tol=0.0)\n" | |
| "--\n" | |
| "\n" | |
| "Determine whether two floating-point numbers are close in value.\n" | |
| "\n" | |
| " rel_tol\n" | |
| " maximum difference for being considered \"close\", relative to the\n" | |
| " magnitude of the input values\n" | |
| " abs_tol\n" | |
| " maximum difference for being considered \"close\", regardless of the\n" | |
| " magnitude of the input values\n" | |
| "\n" | |
| "Return True if a is close in value to b, and False otherwise.\n" | |
| "\n" | |
| "For the values to be considered close, the difference between them\n" | |
| "must be smaller than at least one of the tolerances.\n" | |
| "\n" | |
| "-inf, inf and NaN behave similarly to the IEEE 754 Standard. That\n" | |
| "is, NaN is not close to anything, even itself. inf and -inf are\n" | |
| "only close to themselves."); | |
| #define MATH_ISCLOSE_METHODDEF \ | |
| {"isclose", _PyCFunction_CAST(math_isclose), METH_FASTCALL|METH_KEYWORDS, math_isclose__doc__}, | |
| static int | |
| math_isclose_impl(PyObject *module, double a, double b, double rel_tol, | |
| double abs_tol); | |
| static PyObject * | |
| math_isclose(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) | |
| { | |
| PyObject *return_value = NULL; | |
| #if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE) | |
| #define NUM_KEYWORDS 4 | |
| static struct { | |
| PyGC_Head _this_is_not_used; | |
| PyObject_VAR_HEAD | |
| Py_hash_t ob_hash; | |
| PyObject *ob_item[NUM_KEYWORDS]; | |
| } _kwtuple = { | |
| .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS) | |
| .ob_hash = -1, | |
| .ob_item = { _Py_LATIN1_CHR('a'), _Py_LATIN1_CHR('b'), &_Py_ID(rel_tol), &_Py_ID(abs_tol), }, | |
| }; | |
| #undef NUM_KEYWORDS | |
| #define KWTUPLE (&_kwtuple.ob_base.ob_base) | |
| #else // !Py_BUILD_CORE | |
| # define KWTUPLE NULL | |
| #endif // !Py_BUILD_CORE | |
| static const char * const _keywords[] = {"a", "b", "rel_tol", "abs_tol", NULL}; | |
| static _PyArg_Parser _parser = { | |
| .keywords = _keywords, | |
| .fname = "isclose", | |
| .kwtuple = KWTUPLE, | |
| }; | |
| #undef KWTUPLE | |
| PyObject *argsbuf[4]; | |
| Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 2; | |
| double a; | |
| double b; | |
| double rel_tol = 1e-09; | |
| double abs_tol = 0.0; | |
| int _return_value; | |
| args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, | |
| /*minpos*/ 2, /*maxpos*/ 2, /*minkw*/ 0, /*varpos*/ 0, argsbuf); | |
| if (!args) { | |
| goto exit; | |
| } | |
| if (PyFloat_CheckExact(args[0])) { | |
| a = PyFloat_AS_DOUBLE(args[0]); | |
| } | |
| else | |
| { | |
| a = PyFloat_AsDouble(args[0]); | |
| if (a == -1.0 && PyErr_Occurred()) { | |
| goto exit; | |
| } | |
| } | |
| if (PyFloat_CheckExact(args[1])) { | |
| b = PyFloat_AS_DOUBLE(args[1]); | |
| } | |
| else | |
| { | |
| b = PyFloat_AsDouble(args[1]); | |
| if (b == -1.0 && PyErr_Occurred()) { | |
| goto exit; | |
| } | |
| } | |
| if (!noptargs) { | |
| goto skip_optional_kwonly; | |
| } | |
| if (args[2]) { | |
| if (PyFloat_CheckExact(args[2])) { | |
| rel_tol = PyFloat_AS_DOUBLE(args[2]); | |
| } | |
| else | |
| { | |
| rel_tol = PyFloat_AsDouble(args[2]); | |
| if (rel_tol == -1.0 && PyErr_Occurred()) { | |
| goto exit; | |
| } | |
| } | |
| if (!--noptargs) { | |
| goto skip_optional_kwonly; | |
| } | |
| } | |
| if (PyFloat_CheckExact(args[3])) { | |
| abs_tol = PyFloat_AS_DOUBLE(args[3]); | |
| } | |
| else | |
| { | |
| abs_tol = PyFloat_AsDouble(args[3]); | |
| if (abs_tol == -1.0 && PyErr_Occurred()) { | |
| goto exit; | |
| } | |
| } | |
| skip_optional_kwonly: | |
| _return_value = math_isclose_impl(module, a, b, rel_tol, abs_tol); | |
| if ((_return_value == -1) && PyErr_Occurred()) { | |
| goto exit; | |
| } | |
| return_value = PyBool_FromLong((long)_return_value); | |
| exit: | |
| return return_value; | |
| } | |
| PyDoc_STRVAR(math_prod__doc__, | |
| "prod($module, iterable, /, *, start=1)\n" | |
| "--\n" | |
| "\n" | |
| "Calculate the product of all the elements in the input iterable.\n" | |
| "\n" | |
| "The default start value for the product is 1.\n" | |
| "\n" | |
| "When the iterable is empty, return the start value. This function is\n" | |
| "intended specifically for use with numeric values and may reject\n" | |
| "non-numeric types."); | |
| #define MATH_PROD_METHODDEF \ | |
| {"prod", _PyCFunction_CAST(math_prod), METH_FASTCALL|METH_KEYWORDS, math_prod__doc__}, | |
| static PyObject * | |
| math_prod_impl(PyObject *module, PyObject *iterable, PyObject *start); | |
| static PyObject * | |
| math_prod(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) | |
| { | |
| PyObject *return_value = NULL; | |
| #if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE) | |
| #define NUM_KEYWORDS 1 | |
| static struct { | |
| PyGC_Head _this_is_not_used; | |
| PyObject_VAR_HEAD | |
| Py_hash_t ob_hash; | |
| PyObject *ob_item[NUM_KEYWORDS]; | |
| } _kwtuple = { | |
| .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS) | |
| .ob_hash = -1, | |
| .ob_item = { &_Py_ID(start), }, | |
| }; | |
| #undef NUM_KEYWORDS | |
| #define KWTUPLE (&_kwtuple.ob_base.ob_base) | |
| #else // !Py_BUILD_CORE | |
| # define KWTUPLE NULL | |
| #endif // !Py_BUILD_CORE | |
| static const char * const _keywords[] = {"", "start", NULL}; | |
| static _PyArg_Parser _parser = { | |
| .keywords = _keywords, | |
| .fname = "prod", | |
| .kwtuple = KWTUPLE, | |
| }; | |
| #undef KWTUPLE | |
| PyObject *argsbuf[2]; | |
| Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1; | |
| PyObject *iterable; | |
| PyObject *start = NULL; | |
| args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, | |
| /*minpos*/ 1, /*maxpos*/ 1, /*minkw*/ 0, /*varpos*/ 0, argsbuf); | |
| if (!args) { | |
| goto exit; | |
| } | |
| iterable = args[0]; | |
| if (!noptargs) { | |
| goto skip_optional_kwonly; | |
| } | |
| start = args[1]; | |
| skip_optional_kwonly: | |
| return_value = math_prod_impl(module, iterable, start); | |
| exit: | |
| return return_value; | |
| } | |
| PyDoc_STRVAR(math_nextafter__doc__, | |
| "nextafter($module, x, y, /, *, steps=None)\n" | |
| "--\n" | |
| "\n" | |
| "Return the floating-point value the given number of steps after x towards y.\n" | |
| "\n" | |
| "If steps is not specified or is None, it defaults to 1.\n" | |
| "\n" | |
| "Raises a TypeError, if x or y is not a double, or if steps is not\n" | |
| "an integer. Raises ValueError if steps is negative."); | |
| #define MATH_NEXTAFTER_METHODDEF \ | |
| {"nextafter", _PyCFunction_CAST(math_nextafter), METH_FASTCALL|METH_KEYWORDS, math_nextafter__doc__}, | |
| static PyObject * | |
| math_nextafter_impl(PyObject *module, double x, double y, PyObject *steps); | |
| static PyObject * | |
| math_nextafter(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) | |
| { | |
| PyObject *return_value = NULL; | |
| #if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE) | |
| #define NUM_KEYWORDS 1 | |
| static struct { | |
| PyGC_Head _this_is_not_used; | |
| PyObject_VAR_HEAD | |
| Py_hash_t ob_hash; | |
| PyObject *ob_item[NUM_KEYWORDS]; | |
| } _kwtuple = { | |
| .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS) | |
| .ob_hash = -1, | |
| .ob_item = { &_Py_ID(steps), }, | |
| }; | |
| #undef NUM_KEYWORDS | |
| #define KWTUPLE (&_kwtuple.ob_base.ob_base) | |
| #else // !Py_BUILD_CORE | |
| # define KWTUPLE NULL | |
| #endif // !Py_BUILD_CORE | |
| static const char * const _keywords[] = {"", "", "steps", NULL}; | |
| static _PyArg_Parser _parser = { | |
| .keywords = _keywords, | |
| .fname = "nextafter", | |
| .kwtuple = KWTUPLE, | |
| }; | |
| #undef KWTUPLE | |
| PyObject *argsbuf[3]; | |
| Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 2; | |
| double x; | |
| double y; | |
| PyObject *steps = Py_None; | |
| args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, | |
| /*minpos*/ 2, /*maxpos*/ 2, /*minkw*/ 0, /*varpos*/ 0, argsbuf); | |
| if (!args) { | |
| goto exit; | |
| } | |
| if (PyFloat_CheckExact(args[0])) { | |
| x = PyFloat_AS_DOUBLE(args[0]); | |
| } | |
| else | |
| { | |
| x = PyFloat_AsDouble(args[0]); | |
| if (x == -1.0 && PyErr_Occurred()) { | |
| goto exit; | |
| } | |
| } | |
| if (PyFloat_CheckExact(args[1])) { | |
| y = PyFloat_AS_DOUBLE(args[1]); | |
| } | |
| else | |
| { | |
| y = PyFloat_AsDouble(args[1]); | |
| if (y == -1.0 && PyErr_Occurred()) { | |
| goto exit; | |
| } | |
| } | |
| if (!noptargs) { | |
| goto skip_optional_kwonly; | |
| } | |
| steps = args[2]; | |
| skip_optional_kwonly: | |
| return_value = math_nextafter_impl(module, x, y, steps); | |
| exit: | |
| return return_value; | |
| } | |
| PyDoc_STRVAR(math_ulp__doc__, | |
| "ulp($module, x, /)\n" | |
| "--\n" | |
| "\n" | |
| "Return the value of the least significant bit of the float x."); | |
| #define MATH_ULP_METHODDEF \ | |
| {"ulp", (PyCFunction)math_ulp, METH_O, math_ulp__doc__}, | |
| static double | |
| math_ulp_impl(PyObject *module, double x); | |
| static PyObject * | |
| math_ulp(PyObject *module, PyObject *arg) | |
| { | |
| PyObject *return_value = NULL; | |
| double x; | |
| double _return_value; | |
| if (PyFloat_CheckExact(arg)) { | |
| x = PyFloat_AS_DOUBLE(arg); | |
| } | |
| else | |
| { | |
| x = PyFloat_AsDouble(arg); | |
| if (x == -1.0 && PyErr_Occurred()) { | |
| goto exit; | |
| } | |
| } | |
| _return_value = math_ulp_impl(module, x); | |
| if ((_return_value == -1.0) && PyErr_Occurred()) { | |
| goto exit; | |
| } | |
| return_value = PyFloat_FromDouble(_return_value); | |
| exit: | |
| return return_value; | |
| } | |
| /*[clinic end generated code: output=3452ce8caa2d1bd7 input=a9049054013a1b77]*/ |