LCOV - code coverage report
Current view: top level - Modules/clinic - mathmodule.c.h (source / functions) Hit Total Coverage
Test: CPython 3.12 LCOV report [commit acb105a7c1f] Lines: 220 253 87.0 %
Date: 2022-07-20 13:12:14 Functions: 18 18 100.0 %
Branches: 126 205 61.5 %

           Branch data     Line data    Source code
       1                 :            : /*[clinic input]
       2                 :            : preserve
       3                 :            : [clinic start generated code]*/
       4                 :            : 
       5                 :            : PyDoc_STRVAR(math_ceil__doc__,
       6                 :            : "ceil($module, x, /)\n"
       7                 :            : "--\n"
       8                 :            : "\n"
       9                 :            : "Return the ceiling of x as an Integral.\n"
      10                 :            : "\n"
      11                 :            : "This is the smallest integer >= x.");
      12                 :            : 
      13                 :            : #define MATH_CEIL_METHODDEF    \
      14                 :            :     {"ceil", (PyCFunction)math_ceil, METH_O, math_ceil__doc__},
      15                 :            : 
      16                 :            : PyDoc_STRVAR(math_floor__doc__,
      17                 :            : "floor($module, x, /)\n"
      18                 :            : "--\n"
      19                 :            : "\n"
      20                 :            : "Return the floor of x as an Integral.\n"
      21                 :            : "\n"
      22                 :            : "This is the largest integer <= x.");
      23                 :            : 
      24                 :            : #define MATH_FLOOR_METHODDEF    \
      25                 :            :     {"floor", (PyCFunction)math_floor, METH_O, math_floor__doc__},
      26                 :            : 
      27                 :            : PyDoc_STRVAR(math_fsum__doc__,
      28                 :            : "fsum($module, seq, /)\n"
      29                 :            : "--\n"
      30                 :            : "\n"
      31                 :            : "Return an accurate floating point sum of values in the iterable seq.\n"
      32                 :            : "\n"
      33                 :            : "Assumes IEEE-754 floating point arithmetic.");
      34                 :            : 
      35                 :            : #define MATH_FSUM_METHODDEF    \
      36                 :            :     {"fsum", (PyCFunction)math_fsum, METH_O, math_fsum__doc__},
      37                 :            : 
      38                 :            : PyDoc_STRVAR(math_isqrt__doc__,
      39                 :            : "isqrt($module, n, /)\n"
      40                 :            : "--\n"
      41                 :            : "\n"
      42                 :            : "Return the integer part of the square root of the input.");
      43                 :            : 
      44                 :            : #define MATH_ISQRT_METHODDEF    \
      45                 :            :     {"isqrt", (PyCFunction)math_isqrt, METH_O, math_isqrt__doc__},
      46                 :            : 
      47                 :            : PyDoc_STRVAR(math_factorial__doc__,
      48                 :            : "factorial($module, n, /)\n"
      49                 :            : "--\n"
      50                 :            : "\n"
      51                 :            : "Find n!.\n"
      52                 :            : "\n"
      53                 :            : "Raise a ValueError if x is negative or non-integral.");
      54                 :            : 
      55                 :            : #define MATH_FACTORIAL_METHODDEF    \
      56                 :            :     {"factorial", (PyCFunction)math_factorial, METH_O, math_factorial__doc__},
      57                 :            : 
      58                 :            : PyDoc_STRVAR(math_trunc__doc__,
      59                 :            : "trunc($module, x, /)\n"
      60                 :            : "--\n"
      61                 :            : "\n"
      62                 :            : "Truncates the Real x to the nearest Integral toward 0.\n"
      63                 :            : "\n"
      64                 :            : "Uses the __trunc__ magic method.");
      65                 :            : 
      66                 :            : #define MATH_TRUNC_METHODDEF    \
      67                 :            :     {"trunc", (PyCFunction)math_trunc, METH_O, math_trunc__doc__},
      68                 :            : 
      69                 :            : PyDoc_STRVAR(math_frexp__doc__,
      70                 :            : "frexp($module, x, /)\n"
      71                 :            : "--\n"
      72                 :            : "\n"
      73                 :            : "Return the mantissa and exponent of x, as pair (m, e).\n"
      74                 :            : "\n"
      75                 :            : "m is a float and e is an int, such that x = m * 2.**e.\n"
      76                 :            : "If x is 0, m and e are both 0.  Else 0.5 <= abs(m) < 1.0.");
      77                 :            : 
      78                 :            : #define MATH_FREXP_METHODDEF    \
      79                 :            :     {"frexp", (PyCFunction)math_frexp, METH_O, math_frexp__doc__},
      80                 :            : 
      81                 :            : static PyObject *
      82                 :            : math_frexp_impl(PyObject *module, double x);
      83                 :            : 
      84                 :            : static PyObject *
      85                 :     523934 : math_frexp(PyObject *module, PyObject *arg)
      86                 :            : {
      87                 :     523934 :     PyObject *return_value = NULL;
      88                 :            :     double x;
      89                 :            : 
      90         [ +  + ]:     523934 :     if (PyFloat_CheckExact(arg)) {
      91                 :     483834 :         x = PyFloat_AS_DOUBLE(arg);
      92                 :            :     }
      93                 :            :     else
      94                 :            :     {
      95                 :      40100 :         x = PyFloat_AsDouble(arg);
      96   [ +  +  -  + ]:      40100 :         if (x == -1.0 && PyErr_Occurred()) {
      97                 :          0 :             goto exit;
      98                 :            :         }
      99                 :            :     }
     100                 :     523934 :     return_value = math_frexp_impl(module, x);
     101                 :            : 
     102                 :     523934 : exit:
     103                 :     523934 :     return return_value;
     104                 :            : }
     105                 :            : 
     106                 :            : PyDoc_STRVAR(math_ldexp__doc__,
     107                 :            : "ldexp($module, x, i, /)\n"
     108                 :            : "--\n"
     109                 :            : "\n"
     110                 :            : "Return x * (2**i).\n"
     111                 :            : "\n"
     112                 :            : "This is essentially the inverse of frexp().");
     113                 :            : 
     114                 :            : #define MATH_LDEXP_METHODDEF    \
     115                 :            :     {"ldexp", _PyCFunction_CAST(math_ldexp), METH_FASTCALL, math_ldexp__doc__},
     116                 :            : 
     117                 :            : static PyObject *
     118                 :            : math_ldexp_impl(PyObject *module, double x, PyObject *i);
     119                 :            : 
     120                 :            : static PyObject *
     121                 :     597505 : math_ldexp(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
     122                 :            : {
     123                 :     597505 :     PyObject *return_value = NULL;
     124                 :            :     double x;
     125                 :            :     PyObject *i;
     126                 :            : 
     127   [ +  +  -  +  :     597505 :     if (!_PyArg_CheckPositional("ldexp", nargs, 2, 2)) {
                   +  - ]
     128                 :          1 :         goto exit;
     129                 :            :     }
     130         [ +  + ]:     597504 :     if (PyFloat_CheckExact(args[0])) {
     131                 :     544634 :         x = PyFloat_AS_DOUBLE(args[0]);
     132                 :            :     }
     133                 :            :     else
     134                 :            :     {
     135                 :      52870 :         x = PyFloat_AsDouble(args[0]);
     136   [ +  +  -  + ]:      52870 :         if (x == -1.0 && PyErr_Occurred()) {
     137                 :          0 :             goto exit;
     138                 :            :         }
     139                 :            :     }
     140                 :     597504 :     i = args[1];
     141                 :     597504 :     return_value = math_ldexp_impl(module, x, i);
     142                 :            : 
     143                 :     597505 : exit:
     144                 :     597505 :     return return_value;
     145                 :            : }
     146                 :            : 
     147                 :            : PyDoc_STRVAR(math_modf__doc__,
     148                 :            : "modf($module, x, /)\n"
     149                 :            : "--\n"
     150                 :            : "\n"
     151                 :            : "Return the fractional and integer parts of x.\n"
     152                 :            : "\n"
     153                 :            : "Both results carry the sign of x and are floats.");
     154                 :            : 
     155                 :            : #define MATH_MODF_METHODDEF    \
     156                 :            :     {"modf", (PyCFunction)math_modf, METH_O, math_modf__doc__},
     157                 :            : 
     158                 :            : static PyObject *
     159                 :            : math_modf_impl(PyObject *module, double x);
     160                 :            : 
     161                 :            : static PyObject *
     162                 :       3146 : math_modf(PyObject *module, PyObject *arg)
     163                 :            : {
     164                 :       3146 :     PyObject *return_value = NULL;
     165                 :            :     double x;
     166                 :            : 
     167         [ +  + ]:       3146 :     if (PyFloat_CheckExact(arg)) {
     168                 :       2461 :         x = PyFloat_AS_DOUBLE(arg);
     169                 :            :     }
     170                 :            :     else
     171                 :            :     {
     172                 :        685 :         x = PyFloat_AsDouble(arg);
     173   [ -  +  -  - ]:        685 :         if (x == -1.0 && PyErr_Occurred()) {
     174                 :          0 :             goto exit;
     175                 :            :         }
     176                 :            :     }
     177                 :       3146 :     return_value = math_modf_impl(module, x);
     178                 :            : 
     179                 :       3146 : exit:
     180                 :       3146 :     return return_value;
     181                 :            : }
     182                 :            : 
     183                 :            : PyDoc_STRVAR(math_log__doc__,
     184                 :            : "log(x, [base=math.e])\n"
     185                 :            : "Return the logarithm of x to the given base.\n"
     186                 :            : "\n"
     187                 :            : "If the base not specified, returns the natural logarithm (base e) of x.");
     188                 :            : 
     189                 :            : #define MATH_LOG_METHODDEF    \
     190                 :            :     {"log", (PyCFunction)math_log, METH_VARARGS, math_log__doc__},
     191                 :            : 
     192                 :            : static PyObject *
     193                 :            : math_log_impl(PyObject *module, PyObject *x, int group_right_1,
     194                 :            :               PyObject *base);
     195                 :            : 
     196                 :            : static PyObject *
     197                 :    1012257 : math_log(PyObject *module, PyObject *args)
     198                 :            : {
     199                 :    1012257 :     PyObject *return_value = NULL;
     200                 :            :     PyObject *x;
     201                 :    1012257 :     int group_right_1 = 0;
     202                 :    1012257 :     PyObject *base = NULL;
     203                 :            : 
     204      [ +  +  + ]:    1012257 :     switch (PyTuple_GET_SIZE(args)) {
     205                 :    1005355 :         case 1:
     206         [ -  + ]:    1005355 :             if (!PyArg_ParseTuple(args, "O:log", &x)) {
     207                 :          0 :                 goto exit;
     208                 :            :             }
     209                 :    1005355 :             break;
     210                 :       6901 :         case 2:
     211         [ -  + ]:       6901 :             if (!PyArg_ParseTuple(args, "OO:log", &x, &base)) {
     212                 :          0 :                 goto exit;
     213                 :            :             }
     214                 :       6901 :             group_right_1 = 1;
     215                 :       6901 :             break;
     216                 :          1 :         default:
     217                 :          1 :             PyErr_SetString(PyExc_TypeError, "math.log requires 1 to 2 arguments");
     218                 :          1 :             goto exit;
     219                 :            :     }
     220                 :    1012256 :     return_value = math_log_impl(module, x, group_right_1, base);
     221                 :            : 
     222                 :    1012257 : exit:
     223                 :    1012257 :     return return_value;
     224                 :            : }
     225                 :            : 
     226                 :            : PyDoc_STRVAR(math_log2__doc__,
     227                 :            : "log2($module, x, /)\n"
     228                 :            : "--\n"
     229                 :            : "\n"
     230                 :            : "Return the base 2 logarithm of x.");
     231                 :            : 
     232                 :            : #define MATH_LOG2_METHODDEF    \
     233                 :            :     {"log2", (PyCFunction)math_log2, METH_O, math_log2__doc__},
     234                 :            : 
     235                 :            : PyDoc_STRVAR(math_log10__doc__,
     236                 :            : "log10($module, x, /)\n"
     237                 :            : "--\n"
     238                 :            : "\n"
     239                 :            : "Return the base 10 logarithm of x.");
     240                 :            : 
     241                 :            : #define MATH_LOG10_METHODDEF    \
     242                 :            :     {"log10", (PyCFunction)math_log10, METH_O, math_log10__doc__},
     243                 :            : 
     244                 :            : PyDoc_STRVAR(math_fmod__doc__,
     245                 :            : "fmod($module, x, y, /)\n"
     246                 :            : "--\n"
     247                 :            : "\n"
     248                 :            : "Return fmod(x, y), according to platform C.\n"
     249                 :            : "\n"
     250                 :            : "x % y may differ.");
     251                 :            : 
     252                 :            : #define MATH_FMOD_METHODDEF    \
     253                 :            :     {"fmod", _PyCFunction_CAST(math_fmod), METH_FASTCALL, math_fmod__doc__},
     254                 :            : 
     255                 :            : static PyObject *
     256                 :            : math_fmod_impl(PyObject *module, double x, double y);
     257                 :            : 
     258                 :            : static PyObject *
     259                 :         20 : math_fmod(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
     260                 :            : {
     261                 :         20 :     PyObject *return_value = NULL;
     262                 :            :     double x;
     263                 :            :     double y;
     264                 :            : 
     265   [ +  +  -  +  :         20 :     if (!_PyArg_CheckPositional("fmod", nargs, 2, 2)) {
                   +  - ]
     266                 :          1 :         goto exit;
     267                 :            :     }
     268         [ +  + ]:         19 :     if (PyFloat_CheckExact(args[0])) {
     269                 :         13 :         x = PyFloat_AS_DOUBLE(args[0]);
     270                 :            :     }
     271                 :            :     else
     272                 :            :     {
     273                 :          6 :         x = PyFloat_AsDouble(args[0]);
     274   [ -  +  -  - ]:          6 :         if (x == -1.0 && PyErr_Occurred()) {
     275                 :          0 :             goto exit;
     276                 :            :         }
     277                 :            :     }
     278         [ +  + ]:         19 :     if (PyFloat_CheckExact(args[1])) {
     279                 :         17 :         y = PyFloat_AS_DOUBLE(args[1]);
     280                 :            :     }
     281                 :            :     else
     282                 :            :     {
     283                 :          2 :         y = PyFloat_AsDouble(args[1]);
     284   [ -  +  -  - ]:          2 :         if (y == -1.0 && PyErr_Occurred()) {
     285                 :          0 :             goto exit;
     286                 :            :         }
     287                 :            :     }
     288                 :         19 :     return_value = math_fmod_impl(module, x, y);
     289                 :            : 
     290                 :         20 : exit:
     291                 :         20 :     return return_value;
     292                 :            : }
     293                 :            : 
     294                 :            : PyDoc_STRVAR(math_dist__doc__,
     295                 :            : "dist($module, p, q, /)\n"
     296                 :            : "--\n"
     297                 :            : "\n"
     298                 :            : "Return the Euclidean distance between two points p and q.\n"
     299                 :            : "\n"
     300                 :            : "The points should be specified as sequences (or iterables) of\n"
     301                 :            : "coordinates.  Both inputs must have the same dimension.\n"
     302                 :            : "\n"
     303                 :            : "Roughly equivalent to:\n"
     304                 :            : "    sqrt(sum((px - qx) ** 2.0 for px, qx in zip(p, q)))");
     305                 :            : 
     306                 :            : #define MATH_DIST_METHODDEF    \
     307                 :            :     {"dist", _PyCFunction_CAST(math_dist), METH_FASTCALL, math_dist__doc__},
     308                 :            : 
     309                 :            : static PyObject *
     310                 :            : math_dist_impl(PyObject *module, PyObject *p, PyObject *q);
     311                 :            : 
     312                 :            : static PyObject *
     313                 :     113771 : math_dist(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
     314                 :            : {
     315                 :     113771 :     PyObject *return_value = NULL;
     316                 :            :     PyObject *p;
     317                 :            :     PyObject *q;
     318                 :            : 
     319   [ +  +  +  +  :     113771 :     if (!_PyArg_CheckPositional("dist", nargs, 2, 2)) {
                   +  - ]
     320                 :          2 :         goto exit;
     321                 :            :     }
     322                 :     113769 :     p = args[0];
     323                 :     113769 :     q = args[1];
     324                 :     113769 :     return_value = math_dist_impl(module, p, q);
     325                 :            : 
     326                 :     113771 : exit:
     327                 :     113771 :     return return_value;
     328                 :            : }
     329                 :            : 
     330                 :            : PyDoc_STRVAR(math_pow__doc__,
     331                 :            : "pow($module, x, y, /)\n"
     332                 :            : "--\n"
     333                 :            : "\n"
     334                 :            : "Return x**y (x to the power of y).");
     335                 :            : 
     336                 :            : #define MATH_POW_METHODDEF    \
     337                 :            :     {"pow", _PyCFunction_CAST(math_pow), METH_FASTCALL, math_pow__doc__},
     338                 :            : 
     339                 :            : static PyObject *
     340                 :            : math_pow_impl(PyObject *module, double x, double y);
     341                 :            : 
     342                 :            : static PyObject *
     343                 :        121 : math_pow(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
     344                 :            : {
     345                 :        121 :     PyObject *return_value = NULL;
     346                 :            :     double x;
     347                 :            :     double y;
     348                 :            : 
     349   [ +  +  -  +  :        121 :     if (!_PyArg_CheckPositional("pow", nargs, 2, 2)) {
                   +  - ]
     350                 :          1 :         goto exit;
     351                 :            :     }
     352         [ +  + ]:        120 :     if (PyFloat_CheckExact(args[0])) {
     353                 :        103 :         x = PyFloat_AS_DOUBLE(args[0]);
     354                 :            :     }
     355                 :            :     else
     356                 :            :     {
     357                 :         17 :         x = PyFloat_AsDouble(args[0]);
     358   [ -  +  -  - ]:         17 :         if (x == -1.0 && PyErr_Occurred()) {
     359                 :          0 :             goto exit;
     360                 :            :         }
     361                 :            :     }
     362         [ +  + ]:        120 :     if (PyFloat_CheckExact(args[1])) {
     363                 :        111 :         y = PyFloat_AS_DOUBLE(args[1]);
     364                 :            :     }
     365                 :            :     else
     366                 :            :     {
     367                 :          9 :         y = PyFloat_AsDouble(args[1]);
     368   [ +  +  -  + ]:          9 :         if (y == -1.0 && PyErr_Occurred()) {
     369                 :          0 :             goto exit;
     370                 :            :         }
     371                 :            :     }
     372                 :        120 :     return_value = math_pow_impl(module, x, y);
     373                 :            : 
     374                 :        121 : exit:
     375                 :        121 :     return return_value;
     376                 :            : }
     377                 :            : 
     378                 :            : PyDoc_STRVAR(math_degrees__doc__,
     379                 :            : "degrees($module, x, /)\n"
     380                 :            : "--\n"
     381                 :            : "\n"
     382                 :            : "Convert angle x from radians to degrees.");
     383                 :            : 
     384                 :            : #define MATH_DEGREES_METHODDEF    \
     385                 :            :     {"degrees", (PyCFunction)math_degrees, METH_O, math_degrees__doc__},
     386                 :            : 
     387                 :            : static PyObject *
     388                 :            : math_degrees_impl(PyObject *module, double x);
     389                 :            : 
     390                 :            : static PyObject *
     391                 :         56 : math_degrees(PyObject *module, PyObject *arg)
     392                 :            : {
     393                 :         56 :     PyObject *return_value = NULL;
     394                 :            :     double x;
     395                 :            : 
     396         [ +  + ]:         56 :     if (PyFloat_CheckExact(arg)) {
     397                 :         55 :         x = PyFloat_AS_DOUBLE(arg);
     398                 :            :     }
     399                 :            :     else
     400                 :            :     {
     401                 :          1 :         x = PyFloat_AsDouble(arg);
     402   [ -  +  -  - ]:          1 :         if (x == -1.0 && PyErr_Occurred()) {
     403                 :          0 :             goto exit;
     404                 :            :         }
     405                 :            :     }
     406                 :         56 :     return_value = math_degrees_impl(module, x);
     407                 :            : 
     408                 :         56 : exit:
     409                 :         56 :     return return_value;
     410                 :            : }
     411                 :            : 
     412                 :            : PyDoc_STRVAR(math_radians__doc__,
     413                 :            : "radians($module, x, /)\n"
     414                 :            : "--\n"
     415                 :            : "\n"
     416                 :            : "Convert angle x from degrees to radians.");
     417                 :            : 
     418                 :            : #define MATH_RADIANS_METHODDEF    \
     419                 :            :     {"radians", (PyCFunction)math_radians, METH_O, math_radians__doc__},
     420                 :            : 
     421                 :            : static PyObject *
     422                 :            : math_radians_impl(PyObject *module, double x);
     423                 :            : 
     424                 :            : static PyObject *
     425                 :         43 : math_radians(PyObject *module, PyObject *arg)
     426                 :            : {
     427                 :         43 :     PyObject *return_value = NULL;
     428                 :            :     double x;
     429                 :            : 
     430         [ +  + ]:         43 :     if (PyFloat_CheckExact(arg)) {
     431                 :         34 :         x = PyFloat_AS_DOUBLE(arg);
     432                 :            :     }
     433                 :            :     else
     434                 :            :     {
     435                 :          9 :         x = PyFloat_AsDouble(arg);
     436   [ -  +  -  - ]:          9 :         if (x == -1.0 && PyErr_Occurred()) {
     437                 :          0 :             goto exit;
     438                 :            :         }
     439                 :            :     }
     440                 :         43 :     return_value = math_radians_impl(module, x);
     441                 :            : 
     442                 :         43 : exit:
     443                 :         43 :     return return_value;
     444                 :            : }
     445                 :            : 
     446                 :            : PyDoc_STRVAR(math_isfinite__doc__,
     447                 :            : "isfinite($module, x, /)\n"
     448                 :            : "--\n"
     449                 :            : "\n"
     450                 :            : "Return True if x is neither an infinity nor a NaN, and False otherwise.");
     451                 :            : 
     452                 :            : #define MATH_ISFINITE_METHODDEF    \
     453                 :            :     {"isfinite", (PyCFunction)math_isfinite, METH_O, math_isfinite__doc__},
     454                 :            : 
     455                 :            : static PyObject *
     456                 :            : math_isfinite_impl(PyObject *module, double x);
     457                 :            : 
     458                 :            : static PyObject *
     459                 :        163 : math_isfinite(PyObject *module, PyObject *arg)
     460                 :            : {
     461                 :        163 :     PyObject *return_value = NULL;
     462                 :            :     double x;
     463                 :            : 
     464         [ +  + ]:        163 :     if (PyFloat_CheckExact(arg)) {
     465                 :        158 :         x = PyFloat_AS_DOUBLE(arg);
     466                 :            :     }
     467                 :            :     else
     468                 :            :     {
     469                 :          5 :         x = PyFloat_AsDouble(arg);
     470   [ -  +  -  - ]:          5 :         if (x == -1.0 && PyErr_Occurred()) {
     471                 :          0 :             goto exit;
     472                 :            :         }
     473                 :            :     }
     474                 :        163 :     return_value = math_isfinite_impl(module, x);
     475                 :            : 
     476                 :        163 : exit:
     477                 :        163 :     return return_value;
     478                 :            : }
     479                 :            : 
     480                 :            : PyDoc_STRVAR(math_isnan__doc__,
     481                 :            : "isnan($module, x, /)\n"
     482                 :            : "--\n"
     483                 :            : "\n"
     484                 :            : "Return True if x is a NaN (not a number), and False otherwise.");
     485                 :            : 
     486                 :            : #define MATH_ISNAN_METHODDEF    \
     487                 :            :     {"isnan", (PyCFunction)math_isnan, METH_O, math_isnan__doc__},
     488                 :            : 
     489                 :            : static PyObject *
     490                 :            : math_isnan_impl(PyObject *module, double x);
     491                 :            : 
     492                 :            : static PyObject *
     493                 :     111390 : math_isnan(PyObject *module, PyObject *arg)
     494                 :            : {
     495                 :     111390 :     PyObject *return_value = NULL;
     496                 :            :     double x;
     497                 :            : 
     498         [ +  + ]:     111390 :     if (PyFloat_CheckExact(arg)) {
     499                 :     110072 :         x = PyFloat_AS_DOUBLE(arg);
     500                 :            :     }
     501                 :            :     else
     502                 :            :     {
     503                 :       1318 :         x = PyFloat_AsDouble(arg);
     504   [ +  +  -  + ]:       1318 :         if (x == -1.0 && PyErr_Occurred()) {
     505                 :          0 :             goto exit;
     506                 :            :         }
     507                 :            :     }
     508                 :     111390 :     return_value = math_isnan_impl(module, x);
     509                 :            : 
     510                 :     111390 : exit:
     511                 :     111390 :     return return_value;
     512                 :            : }
     513                 :            : 
     514                 :            : PyDoc_STRVAR(math_isinf__doc__,
     515                 :            : "isinf($module, x, /)\n"
     516                 :            : "--\n"
     517                 :            : "\n"
     518                 :            : "Return True if x is a positive or negative infinity, and False otherwise.");
     519                 :            : 
     520                 :            : #define MATH_ISINF_METHODDEF    \
     521                 :            :     {"isinf", (PyCFunction)math_isinf, METH_O, math_isinf__doc__},
     522                 :            : 
     523                 :            : static PyObject *
     524                 :            : math_isinf_impl(PyObject *module, double x);
     525                 :            : 
     526                 :            : static PyObject *
     527                 :     247236 : math_isinf(PyObject *module, PyObject *arg)
     528                 :            : {
     529                 :     247236 :     PyObject *return_value = NULL;
     530                 :            :     double x;
     531                 :            : 
     532         [ +  + ]:     247236 :     if (PyFloat_CheckExact(arg)) {
     533                 :     246144 :         x = PyFloat_AS_DOUBLE(arg);
     534                 :            :     }
     535                 :            :     else
     536                 :            :     {
     537                 :       1092 :         x = PyFloat_AsDouble(arg);
     538   [ +  +  -  + ]:       1092 :         if (x == -1.0 && PyErr_Occurred()) {
     539                 :          0 :             goto exit;
     540                 :            :         }
     541                 :            :     }
     542                 :     247236 :     return_value = math_isinf_impl(module, x);
     543                 :            : 
     544                 :     247236 : exit:
     545                 :     247236 :     return return_value;
     546                 :            : }
     547                 :            : 
     548                 :            : PyDoc_STRVAR(math_isclose__doc__,
     549                 :            : "isclose($module, /, a, b, *, rel_tol=1e-09, abs_tol=0.0)\n"
     550                 :            : "--\n"
     551                 :            : "\n"
     552                 :            : "Determine whether two floating point numbers are close in value.\n"
     553                 :            : "\n"
     554                 :            : "  rel_tol\n"
     555                 :            : "    maximum difference for being considered \"close\", relative to the\n"
     556                 :            : "    magnitude of the input values\n"
     557                 :            : "  abs_tol\n"
     558                 :            : "    maximum difference for being considered \"close\", regardless of the\n"
     559                 :            : "    magnitude of the input values\n"
     560                 :            : "\n"
     561                 :            : "Return True if a is close in value to b, and False otherwise.\n"
     562                 :            : "\n"
     563                 :            : "For the values to be considered close, the difference between them\n"
     564                 :            : "must be smaller than at least one of the tolerances.\n"
     565                 :            : "\n"
     566                 :            : "-inf, inf and NaN behave similarly to the IEEE 754 Standard.  That\n"
     567                 :            : "is, NaN is not close to anything, even itself.  inf and -inf are\n"
     568                 :            : "only close to themselves.");
     569                 :            : 
     570                 :            : #define MATH_ISCLOSE_METHODDEF    \
     571                 :            :     {"isclose", _PyCFunction_CAST(math_isclose), METH_FASTCALL|METH_KEYWORDS, math_isclose__doc__},
     572                 :            : 
     573                 :            : static int
     574                 :            : math_isclose_impl(PyObject *module, double a, double b, double rel_tol,
     575                 :            :                   double abs_tol);
     576                 :            : 
     577                 :            : static PyObject *
     578                 :        313 : math_isclose(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
     579                 :            : {
     580                 :        313 :     PyObject *return_value = NULL;
     581                 :            :     static const char * const _keywords[] = {"a", "b", "rel_tol", "abs_tol", NULL};
     582                 :            :     static _PyArg_Parser _parser = {NULL, _keywords, "isclose", 0};
     583                 :            :     PyObject *argsbuf[4];
     584         [ +  + ]:        313 :     Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 2;
     585                 :            :     double a;
     586                 :            :     double b;
     587                 :        313 :     double rel_tol = 1e-09;
     588                 :        313 :     double abs_tol = 0.0;
     589                 :            :     int _return_value;
     590                 :            : 
     591   [ +  +  +  -  :        313 :     args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 2, 0, argsbuf);
             +  -  -  + ]
     592         [ -  + ]:        313 :     if (!args) {
     593                 :          0 :         goto exit;
     594                 :            :     }
     595         [ +  + ]:        313 :     if (PyFloat_CheckExact(args[0])) {
     596                 :        289 :         a = PyFloat_AS_DOUBLE(args[0]);
     597                 :            :     }
     598                 :            :     else
     599                 :            :     {
     600                 :         24 :         a = PyFloat_AsDouble(args[0]);
     601   [ -  +  -  - ]:         24 :         if (a == -1.0 && PyErr_Occurred()) {
     602                 :          0 :             goto exit;
     603                 :            :         }
     604                 :            :     }
     605         [ +  + ]:        313 :     if (PyFloat_CheckExact(args[1])) {
     606                 :        290 :         b = PyFloat_AS_DOUBLE(args[1]);
     607                 :            :     }
     608                 :            :     else
     609                 :            :     {
     610                 :         23 :         b = PyFloat_AsDouble(args[1]);
     611   [ -  +  -  - ]:         23 :         if (b == -1.0 && PyErr_Occurred()) {
     612                 :          0 :             goto exit;
     613                 :            :         }
     614                 :            :     }
     615         [ +  + ]:        313 :     if (!noptargs) {
     616                 :        221 :         goto skip_optional_kwonly;
     617                 :            :     }
     618         [ +  + ]:         92 :     if (args[2]) {
     619         [ +  - ]:         65 :         if (PyFloat_CheckExact(args[2])) {
     620                 :         65 :             rel_tol = PyFloat_AS_DOUBLE(args[2]);
     621                 :            :         }
     622                 :            :         else
     623                 :            :         {
     624                 :          0 :             rel_tol = PyFloat_AsDouble(args[2]);
     625   [ #  #  #  # ]:          0 :             if (rel_tol == -1.0 && PyErr_Occurred()) {
     626                 :          0 :                 goto exit;
     627                 :            :             }
     628                 :            :         }
     629         [ +  + ]:         65 :         if (!--noptargs) {
     630                 :         58 :             goto skip_optional_kwonly;
     631                 :            :         }
     632                 :            :     }
     633         [ +  - ]:         34 :     if (PyFloat_CheckExact(args[3])) {
     634                 :         34 :         abs_tol = PyFloat_AS_DOUBLE(args[3]);
     635                 :            :     }
     636                 :            :     else
     637                 :            :     {
     638                 :          0 :         abs_tol = PyFloat_AsDouble(args[3]);
     639   [ #  #  #  # ]:          0 :         if (abs_tol == -1.0 && PyErr_Occurred()) {
     640                 :          0 :             goto exit;
     641                 :            :         }
     642                 :            :     }
     643                 :          0 : skip_optional_kwonly:
     644                 :        313 :     _return_value = math_isclose_impl(module, a, b, rel_tol, abs_tol);
     645   [ +  +  +  - ]:        313 :     if ((_return_value == -1) && PyErr_Occurred()) {
     646                 :          2 :         goto exit;
     647                 :            :     }
     648                 :        311 :     return_value = PyBool_FromLong((long)_return_value);
     649                 :            : 
     650                 :        313 : exit:
     651                 :        313 :     return return_value;
     652                 :            : }
     653                 :            : 
     654                 :            : PyDoc_STRVAR(math_prod__doc__,
     655                 :            : "prod($module, iterable, /, *, start=1)\n"
     656                 :            : "--\n"
     657                 :            : "\n"
     658                 :            : "Calculate the product of all the elements in the input iterable.\n"
     659                 :            : "\n"
     660                 :            : "The default start value for the product is 1.\n"
     661                 :            : "\n"
     662                 :            : "When the iterable is empty, return the start value.  This function is\n"
     663                 :            : "intended specifically for use with numeric values and may reject\n"
     664                 :            : "non-numeric types.");
     665                 :            : 
     666                 :            : #define MATH_PROD_METHODDEF    \
     667                 :            :     {"prod", _PyCFunction_CAST(math_prod), METH_FASTCALL|METH_KEYWORDS, math_prod__doc__},
     668                 :            : 
     669                 :            : static PyObject *
     670                 :            : math_prod_impl(PyObject *module, PyObject *iterable, PyObject *start);
     671                 :            : 
     672                 :            : static PyObject *
     673                 :         62 : math_prod(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
     674                 :            : {
     675                 :         62 :     PyObject *return_value = NULL;
     676                 :            :     static const char * const _keywords[] = {"", "start", NULL};
     677                 :            :     static _PyArg_Parser _parser = {NULL, _keywords, "prod", 0};
     678                 :            :     PyObject *argsbuf[2];
     679         [ +  + ]:         62 :     Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1;
     680                 :            :     PyObject *iterable;
     681                 :         62 :     PyObject *start = NULL;
     682                 :            : 
     683   [ +  +  +  +  :         62 :     args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf);
             +  +  -  + ]
     684         [ +  + ]:         62 :     if (!args) {
     685                 :          2 :         goto exit;
     686                 :            :     }
     687                 :         60 :     iterable = args[0];
     688         [ +  + ]:         60 :     if (!noptargs) {
     689                 :         49 :         goto skip_optional_kwonly;
     690                 :            :     }
     691                 :         11 :     start = args[1];
     692                 :         60 : skip_optional_kwonly:
     693                 :         60 :     return_value = math_prod_impl(module, iterable, start);
     694                 :            : 
     695                 :         62 : exit:
     696                 :         62 :     return return_value;
     697                 :            : }
     698                 :            : 
     699                 :            : PyDoc_STRVAR(math_perm__doc__,
     700                 :            : "perm($module, n, k=None, /)\n"
     701                 :            : "--\n"
     702                 :            : "\n"
     703                 :            : "Number of ways to choose k items from n items without repetition and with order.\n"
     704                 :            : "\n"
     705                 :            : "Evaluates to n! / (n - k)! when k <= n and evaluates\n"
     706                 :            : "to zero when k > n.\n"
     707                 :            : "\n"
     708                 :            : "If k is not specified or is None, then k defaults to n\n"
     709                 :            : "and the function returns n!.\n"
     710                 :            : "\n"
     711                 :            : "Raises TypeError if either of the arguments are not integers.\n"
     712                 :            : "Raises ValueError if either of the arguments are negative.");
     713                 :            : 
     714                 :            : #define MATH_PERM_METHODDEF    \
     715                 :            :     {"perm", _PyCFunction_CAST(math_perm), METH_FASTCALL, math_perm__doc__},
     716                 :            : 
     717                 :            : static PyObject *
     718                 :            : math_perm_impl(PyObject *module, PyObject *n, PyObject *k);
     719                 :            : 
     720                 :            : static PyObject *
     721                 :      25973 : math_perm(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
     722                 :            : {
     723                 :      25973 :     PyObject *return_value = NULL;
     724                 :            :     PyObject *n;
     725                 :      25973 :     PyObject *k = Py_None;
     726                 :            : 
     727   [ +  +  +  +  :      25973 :     if (!_PyArg_CheckPositional("perm", nargs, 1, 2)) {
                   +  - ]
     728                 :          3 :         goto exit;
     729                 :            :     }
     730                 :      25970 :     n = args[0];
     731         [ +  + ]:      25970 :     if (nargs < 2) {
     732                 :         20 :         goto skip_optional;
     733                 :            :     }
     734                 :      25950 :     k = args[1];
     735                 :      25970 : skip_optional:
     736                 :      25970 :     return_value = math_perm_impl(module, n, k);
     737                 :            : 
     738                 :      25973 : exit:
     739                 :      25973 :     return return_value;
     740                 :            : }
     741                 :            : 
     742                 :            : PyDoc_STRVAR(math_comb__doc__,
     743                 :            : "comb($module, n, k, /)\n"
     744                 :            : "--\n"
     745                 :            : "\n"
     746                 :            : "Number of ways to choose k items from n items without repetition and without order.\n"
     747                 :            : "\n"
     748                 :            : "Evaluates to n! / (k! * (n - k)!) when k <= n and evaluates\n"
     749                 :            : "to zero when k > n.\n"
     750                 :            : "\n"
     751                 :            : "Also called the binomial coefficient because it is equivalent\n"
     752                 :            : "to the coefficient of k-th term in polynomial expansion of the\n"
     753                 :            : "expression (1 + x)**n.\n"
     754                 :            : "\n"
     755                 :            : "Raises TypeError if either of the arguments are not integers.\n"
     756                 :            : "Raises ValueError if either of the arguments are negative.");
     757                 :            : 
     758                 :            : #define MATH_COMB_METHODDEF    \
     759                 :            :     {"comb", _PyCFunction_CAST(math_comb), METH_FASTCALL, math_comb__doc__},
     760                 :            : 
     761                 :            : static PyObject *
     762                 :            : math_comb_impl(PyObject *module, PyObject *n, PyObject *k);
     763                 :            : 
     764                 :            : static PyObject *
     765                 :      30937 : math_comb(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
     766                 :            : {
     767                 :      30937 :     PyObject *return_value = NULL;
     768                 :            :     PyObject *n;
     769                 :            :     PyObject *k;
     770                 :            : 
     771   [ +  +  +  +  :      30937 :     if (!_PyArg_CheckPositional("comb", nargs, 2, 2)) {
                   +  - ]
     772                 :          3 :         goto exit;
     773                 :            :     }
     774                 :      30934 :     n = args[0];
     775                 :      30934 :     k = args[1];
     776                 :      30934 :     return_value = math_comb_impl(module, n, k);
     777                 :            : 
     778                 :      30937 : exit:
     779                 :      30937 :     return return_value;
     780                 :            : }
     781                 :            : 
     782                 :            : PyDoc_STRVAR(math_nextafter__doc__,
     783                 :            : "nextafter($module, x, y, /)\n"
     784                 :            : "--\n"
     785                 :            : "\n"
     786                 :            : "Return the next floating-point value after x towards y.");
     787                 :            : 
     788                 :            : #define MATH_NEXTAFTER_METHODDEF    \
     789                 :            :     {"nextafter", _PyCFunction_CAST(math_nextafter), METH_FASTCALL, math_nextafter__doc__},
     790                 :            : 
     791                 :            : static PyObject *
     792                 :            : math_nextafter_impl(PyObject *module, double x, double y);
     793                 :            : 
     794                 :            : static PyObject *
     795                 :     117415 : math_nextafter(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
     796                 :            : {
     797                 :     117415 :     PyObject *return_value = NULL;
     798                 :            :     double x;
     799                 :            :     double y;
     800                 :            : 
     801   [ +  -  -  +  :     117415 :     if (!_PyArg_CheckPositional("nextafter", nargs, 2, 2)) {
                   -  - ]
     802                 :          0 :         goto exit;
     803                 :            :     }
     804         [ +  - ]:     117415 :     if (PyFloat_CheckExact(args[0])) {
     805                 :     117415 :         x = PyFloat_AS_DOUBLE(args[0]);
     806                 :            :     }
     807                 :            :     else
     808                 :            :     {
     809                 :          0 :         x = PyFloat_AsDouble(args[0]);
     810   [ #  #  #  # ]:          0 :         if (x == -1.0 && PyErr_Occurred()) {
     811                 :          0 :             goto exit;
     812                 :            :         }
     813                 :            :     }
     814         [ +  - ]:     117415 :     if (PyFloat_CheckExact(args[1])) {
     815                 :     117415 :         y = PyFloat_AS_DOUBLE(args[1]);
     816                 :            :     }
     817                 :            :     else
     818                 :            :     {
     819                 :          0 :         y = PyFloat_AsDouble(args[1]);
     820   [ #  #  #  # ]:          0 :         if (y == -1.0 && PyErr_Occurred()) {
     821                 :          0 :             goto exit;
     822                 :            :         }
     823                 :            :     }
     824                 :     117415 :     return_value = math_nextafter_impl(module, x, y);
     825                 :            : 
     826                 :     117415 : exit:
     827                 :     117415 :     return return_value;
     828                 :            : }
     829                 :            : 
     830                 :            : PyDoc_STRVAR(math_ulp__doc__,
     831                 :            : "ulp($module, x, /)\n"
     832                 :            : "--\n"
     833                 :            : "\n"
     834                 :            : "Return the value of the least significant bit of the float x.");
     835                 :            : 
     836                 :            : #define MATH_ULP_METHODDEF    \
     837                 :            :     {"ulp", (PyCFunction)math_ulp, METH_O, math_ulp__doc__},
     838                 :            : 
     839                 :            : static double
     840                 :            : math_ulp_impl(PyObject *module, double x);
     841                 :            : 
     842                 :            : static PyObject *
     843                 :         21 : math_ulp(PyObject *module, PyObject *arg)
     844                 :            : {
     845                 :         21 :     PyObject *return_value = NULL;
     846                 :            :     double x;
     847                 :            :     double _return_value;
     848                 :            : 
     849         [ +  + ]:         21 :     if (PyFloat_CheckExact(arg)) {
     850                 :         11 :         x = PyFloat_AS_DOUBLE(arg);
     851                 :            :     }
     852                 :            :     else
     853                 :            :     {
     854                 :         10 :         x = PyFloat_AsDouble(arg);
     855   [ -  +  -  - ]:         10 :         if (x == -1.0 && PyErr_Occurred()) {
     856                 :          0 :             goto exit;
     857                 :            :         }
     858                 :            :     }
     859                 :         21 :     _return_value = math_ulp_impl(module, x);
     860   [ -  +  -  - ]:         21 :     if ((_return_value == -1.0) && PyErr_Occurred()) {
     861                 :          0 :         goto exit;
     862                 :            :     }
     863                 :         21 :     return_value = PyFloat_FromDouble(_return_value);
     864                 :            : 
     865                 :         21 : exit:
     866                 :         21 :     return return_value;
     867                 :            : }
     868                 :            : /*[clinic end generated code: output=965f99dabaa72165 input=a9049054013a1b77]*/

Generated by: LCOV version 1.14