blob: cc1b8f2e21c0e7fb65e58a44f937f77ef170a067 [file] [log] [blame]
Brett Cannonb0fc4902014-10-14 17:37:02 -04001/*[clinic input]
2preserve
3[clinic start generated code]*/
4
5PyDoc_STRVAR(cmath_acos__doc__,
6"acos($module, z, /)\n"
7"--\n"
8"\n"
9"Return the arc cosine of z.");
10
11#define CMATH_ACOS_METHODDEF \
Serhiy Storchaka92e8af62015-04-04 00:12:11 +030012 {"acos", (PyCFunction)cmath_acos, METH_O, cmath_acos__doc__},
Brett Cannonb0fc4902014-10-14 17:37:02 -040013
14static Py_complex
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +030015cmath_acos_impl(PyObject *module, Py_complex z);
Brett Cannonb0fc4902014-10-14 17:37:02 -040016
17static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +030018cmath_acos(PyObject *module, PyObject *arg)
Brett Cannonb0fc4902014-10-14 17:37:02 -040019{
20 PyObject *return_value = NULL;
21 Py_complex z;
22 Py_complex _return_value;
23
Serhiy Storchaka32d96a22018-12-25 13:23:47 +020024 z = PyComplex_AsCComplex(arg);
25 if (PyErr_Occurred()) {
Brett Cannonb0fc4902014-10-14 17:37:02 -040026 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +030027 }
Brett Cannonb0fc4902014-10-14 17:37:02 -040028 /* modifications for z */
29 errno = 0; PyFPE_START_PROTECT("complex function", goto exit);
30 _return_value = cmath_acos_impl(module, z);
31 PyFPE_END_PROTECT(_return_value);
32 if (errno == EDOM) {
33 PyErr_SetString(PyExc_ValueError, "math domain error");
34 goto exit;
35 }
36 else if (errno == ERANGE) {
37 PyErr_SetString(PyExc_OverflowError, "math range error");
38 goto exit;
39 }
40 else {
41 return_value = PyComplex_FromCComplex(_return_value);
42 }
43
44exit:
45 return return_value;
46}
47
48PyDoc_STRVAR(cmath_acosh__doc__,
49"acosh($module, z, /)\n"
50"--\n"
51"\n"
Mark Dickinsoncc8617b2015-01-11 13:22:44 +000052"Return the inverse hyperbolic cosine of z.");
Brett Cannonb0fc4902014-10-14 17:37:02 -040053
54#define CMATH_ACOSH_METHODDEF \
Serhiy Storchaka92e8af62015-04-04 00:12:11 +030055 {"acosh", (PyCFunction)cmath_acosh, METH_O, cmath_acosh__doc__},
Brett Cannonb0fc4902014-10-14 17:37:02 -040056
57static Py_complex
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +030058cmath_acosh_impl(PyObject *module, Py_complex z);
Brett Cannonb0fc4902014-10-14 17:37:02 -040059
60static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +030061cmath_acosh(PyObject *module, PyObject *arg)
Brett Cannonb0fc4902014-10-14 17:37:02 -040062{
63 PyObject *return_value = NULL;
64 Py_complex z;
65 Py_complex _return_value;
66
Serhiy Storchaka32d96a22018-12-25 13:23:47 +020067 z = PyComplex_AsCComplex(arg);
68 if (PyErr_Occurred()) {
Brett Cannonb0fc4902014-10-14 17:37:02 -040069 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +030070 }
Brett Cannonb0fc4902014-10-14 17:37:02 -040071 /* modifications for z */
72 errno = 0; PyFPE_START_PROTECT("complex function", goto exit);
73 _return_value = cmath_acosh_impl(module, z);
74 PyFPE_END_PROTECT(_return_value);
75 if (errno == EDOM) {
76 PyErr_SetString(PyExc_ValueError, "math domain error");
77 goto exit;
78 }
79 else if (errno == ERANGE) {
80 PyErr_SetString(PyExc_OverflowError, "math range error");
81 goto exit;
82 }
83 else {
84 return_value = PyComplex_FromCComplex(_return_value);
85 }
86
87exit:
88 return return_value;
89}
90
91PyDoc_STRVAR(cmath_asin__doc__,
92"asin($module, z, /)\n"
93"--\n"
94"\n"
95"Return the arc sine of z.");
96
97#define CMATH_ASIN_METHODDEF \
Serhiy Storchaka92e8af62015-04-04 00:12:11 +030098 {"asin", (PyCFunction)cmath_asin, METH_O, cmath_asin__doc__},
Brett Cannonb0fc4902014-10-14 17:37:02 -040099
100static Py_complex
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300101cmath_asin_impl(PyObject *module, Py_complex z);
Brett Cannonb0fc4902014-10-14 17:37:02 -0400102
103static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300104cmath_asin(PyObject *module, PyObject *arg)
Brett Cannonb0fc4902014-10-14 17:37:02 -0400105{
106 PyObject *return_value = NULL;
107 Py_complex z;
108 Py_complex _return_value;
109
Serhiy Storchaka32d96a22018-12-25 13:23:47 +0200110 z = PyComplex_AsCComplex(arg);
111 if (PyErr_Occurred()) {
Brett Cannonb0fc4902014-10-14 17:37:02 -0400112 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300113 }
Brett Cannonb0fc4902014-10-14 17:37:02 -0400114 /* modifications for z */
115 errno = 0; PyFPE_START_PROTECT("complex function", goto exit);
116 _return_value = cmath_asin_impl(module, z);
117 PyFPE_END_PROTECT(_return_value);
118 if (errno == EDOM) {
119 PyErr_SetString(PyExc_ValueError, "math domain error");
120 goto exit;
121 }
122 else if (errno == ERANGE) {
123 PyErr_SetString(PyExc_OverflowError, "math range error");
124 goto exit;
125 }
126 else {
127 return_value = PyComplex_FromCComplex(_return_value);
128 }
129
130exit:
131 return return_value;
132}
133
134PyDoc_STRVAR(cmath_asinh__doc__,
135"asinh($module, z, /)\n"
136"--\n"
137"\n"
Mark Dickinsoncc8617b2015-01-11 13:22:44 +0000138"Return the inverse hyperbolic sine of z.");
Brett Cannonb0fc4902014-10-14 17:37:02 -0400139
140#define CMATH_ASINH_METHODDEF \
Serhiy Storchaka92e8af62015-04-04 00:12:11 +0300141 {"asinh", (PyCFunction)cmath_asinh, METH_O, cmath_asinh__doc__},
Brett Cannonb0fc4902014-10-14 17:37:02 -0400142
143static Py_complex
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300144cmath_asinh_impl(PyObject *module, Py_complex z);
Brett Cannonb0fc4902014-10-14 17:37:02 -0400145
146static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300147cmath_asinh(PyObject *module, PyObject *arg)
Brett Cannonb0fc4902014-10-14 17:37:02 -0400148{
149 PyObject *return_value = NULL;
150 Py_complex z;
151 Py_complex _return_value;
152
Serhiy Storchaka32d96a22018-12-25 13:23:47 +0200153 z = PyComplex_AsCComplex(arg);
154 if (PyErr_Occurred()) {
Brett Cannonb0fc4902014-10-14 17:37:02 -0400155 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300156 }
Brett Cannonb0fc4902014-10-14 17:37:02 -0400157 /* modifications for z */
158 errno = 0; PyFPE_START_PROTECT("complex function", goto exit);
159 _return_value = cmath_asinh_impl(module, z);
160 PyFPE_END_PROTECT(_return_value);
161 if (errno == EDOM) {
162 PyErr_SetString(PyExc_ValueError, "math domain error");
163 goto exit;
164 }
165 else if (errno == ERANGE) {
166 PyErr_SetString(PyExc_OverflowError, "math range error");
167 goto exit;
168 }
169 else {
170 return_value = PyComplex_FromCComplex(_return_value);
171 }
172
173exit:
174 return return_value;
175}
176
177PyDoc_STRVAR(cmath_atan__doc__,
178"atan($module, z, /)\n"
179"--\n"
180"\n"
181"Return the arc tangent of z.");
182
183#define CMATH_ATAN_METHODDEF \
Serhiy Storchaka92e8af62015-04-04 00:12:11 +0300184 {"atan", (PyCFunction)cmath_atan, METH_O, cmath_atan__doc__},
Brett Cannonb0fc4902014-10-14 17:37:02 -0400185
186static Py_complex
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300187cmath_atan_impl(PyObject *module, Py_complex z);
Brett Cannonb0fc4902014-10-14 17:37:02 -0400188
189static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300190cmath_atan(PyObject *module, PyObject *arg)
Brett Cannonb0fc4902014-10-14 17:37:02 -0400191{
192 PyObject *return_value = NULL;
193 Py_complex z;
194 Py_complex _return_value;
195
Serhiy Storchaka32d96a22018-12-25 13:23:47 +0200196 z = PyComplex_AsCComplex(arg);
197 if (PyErr_Occurred()) {
Brett Cannonb0fc4902014-10-14 17:37:02 -0400198 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300199 }
Brett Cannonb0fc4902014-10-14 17:37:02 -0400200 /* modifications for z */
201 errno = 0; PyFPE_START_PROTECT("complex function", goto exit);
202 _return_value = cmath_atan_impl(module, z);
203 PyFPE_END_PROTECT(_return_value);
204 if (errno == EDOM) {
205 PyErr_SetString(PyExc_ValueError, "math domain error");
206 goto exit;
207 }
208 else if (errno == ERANGE) {
209 PyErr_SetString(PyExc_OverflowError, "math range error");
210 goto exit;
211 }
212 else {
213 return_value = PyComplex_FromCComplex(_return_value);
214 }
215
216exit:
217 return return_value;
218}
219
220PyDoc_STRVAR(cmath_atanh__doc__,
221"atanh($module, z, /)\n"
222"--\n"
223"\n"
Mark Dickinsoncc8617b2015-01-11 13:22:44 +0000224"Return the inverse hyperbolic tangent of z.");
Brett Cannonb0fc4902014-10-14 17:37:02 -0400225
226#define CMATH_ATANH_METHODDEF \
Serhiy Storchaka92e8af62015-04-04 00:12:11 +0300227 {"atanh", (PyCFunction)cmath_atanh, METH_O, cmath_atanh__doc__},
Brett Cannonb0fc4902014-10-14 17:37:02 -0400228
229static Py_complex
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300230cmath_atanh_impl(PyObject *module, Py_complex z);
Brett Cannonb0fc4902014-10-14 17:37:02 -0400231
232static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300233cmath_atanh(PyObject *module, PyObject *arg)
Brett Cannonb0fc4902014-10-14 17:37:02 -0400234{
235 PyObject *return_value = NULL;
236 Py_complex z;
237 Py_complex _return_value;
238
Serhiy Storchaka32d96a22018-12-25 13:23:47 +0200239 z = PyComplex_AsCComplex(arg);
240 if (PyErr_Occurred()) {
Brett Cannonb0fc4902014-10-14 17:37:02 -0400241 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300242 }
Brett Cannonb0fc4902014-10-14 17:37:02 -0400243 /* modifications for z */
244 errno = 0; PyFPE_START_PROTECT("complex function", goto exit);
245 _return_value = cmath_atanh_impl(module, z);
246 PyFPE_END_PROTECT(_return_value);
247 if (errno == EDOM) {
248 PyErr_SetString(PyExc_ValueError, "math domain error");
249 goto exit;
250 }
251 else if (errno == ERANGE) {
252 PyErr_SetString(PyExc_OverflowError, "math range error");
253 goto exit;
254 }
255 else {
256 return_value = PyComplex_FromCComplex(_return_value);
257 }
258
259exit:
260 return return_value;
261}
262
263PyDoc_STRVAR(cmath_cos__doc__,
264"cos($module, z, /)\n"
265"--\n"
266"\n"
267"Return the cosine of z.");
268
269#define CMATH_COS_METHODDEF \
Serhiy Storchaka92e8af62015-04-04 00:12:11 +0300270 {"cos", (PyCFunction)cmath_cos, METH_O, cmath_cos__doc__},
Brett Cannonb0fc4902014-10-14 17:37:02 -0400271
272static Py_complex
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300273cmath_cos_impl(PyObject *module, Py_complex z);
Brett Cannonb0fc4902014-10-14 17:37:02 -0400274
275static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300276cmath_cos(PyObject *module, PyObject *arg)
Brett Cannonb0fc4902014-10-14 17:37:02 -0400277{
278 PyObject *return_value = NULL;
279 Py_complex z;
280 Py_complex _return_value;
281
Serhiy Storchaka32d96a22018-12-25 13:23:47 +0200282 z = PyComplex_AsCComplex(arg);
283 if (PyErr_Occurred()) {
Brett Cannonb0fc4902014-10-14 17:37:02 -0400284 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300285 }
Brett Cannonb0fc4902014-10-14 17:37:02 -0400286 /* modifications for z */
287 errno = 0; PyFPE_START_PROTECT("complex function", goto exit);
288 _return_value = cmath_cos_impl(module, z);
289 PyFPE_END_PROTECT(_return_value);
290 if (errno == EDOM) {
291 PyErr_SetString(PyExc_ValueError, "math domain error");
292 goto exit;
293 }
294 else if (errno == ERANGE) {
295 PyErr_SetString(PyExc_OverflowError, "math range error");
296 goto exit;
297 }
298 else {
299 return_value = PyComplex_FromCComplex(_return_value);
300 }
301
302exit:
303 return return_value;
304}
305
306PyDoc_STRVAR(cmath_cosh__doc__,
307"cosh($module, z, /)\n"
308"--\n"
309"\n"
310"Return the hyperbolic cosine of z.");
311
312#define CMATH_COSH_METHODDEF \
Serhiy Storchaka92e8af62015-04-04 00:12:11 +0300313 {"cosh", (PyCFunction)cmath_cosh, METH_O, cmath_cosh__doc__},
Brett Cannonb0fc4902014-10-14 17:37:02 -0400314
315static Py_complex
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300316cmath_cosh_impl(PyObject *module, Py_complex z);
Brett Cannonb0fc4902014-10-14 17:37:02 -0400317
318static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300319cmath_cosh(PyObject *module, PyObject *arg)
Brett Cannonb0fc4902014-10-14 17:37:02 -0400320{
321 PyObject *return_value = NULL;
322 Py_complex z;
323 Py_complex _return_value;
324
Serhiy Storchaka32d96a22018-12-25 13:23:47 +0200325 z = PyComplex_AsCComplex(arg);
326 if (PyErr_Occurred()) {
Brett Cannonb0fc4902014-10-14 17:37:02 -0400327 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300328 }
Brett Cannonb0fc4902014-10-14 17:37:02 -0400329 /* modifications for z */
330 errno = 0; PyFPE_START_PROTECT("complex function", goto exit);
331 _return_value = cmath_cosh_impl(module, z);
332 PyFPE_END_PROTECT(_return_value);
333 if (errno == EDOM) {
334 PyErr_SetString(PyExc_ValueError, "math domain error");
335 goto exit;
336 }
337 else if (errno == ERANGE) {
338 PyErr_SetString(PyExc_OverflowError, "math range error");
339 goto exit;
340 }
341 else {
342 return_value = PyComplex_FromCComplex(_return_value);
343 }
344
345exit:
346 return return_value;
347}
348
349PyDoc_STRVAR(cmath_exp__doc__,
350"exp($module, z, /)\n"
351"--\n"
352"\n"
353"Return the exponential value e**z.");
354
355#define CMATH_EXP_METHODDEF \
Serhiy Storchaka92e8af62015-04-04 00:12:11 +0300356 {"exp", (PyCFunction)cmath_exp, METH_O, cmath_exp__doc__},
Brett Cannonb0fc4902014-10-14 17:37:02 -0400357
358static Py_complex
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300359cmath_exp_impl(PyObject *module, Py_complex z);
Brett Cannonb0fc4902014-10-14 17:37:02 -0400360
361static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300362cmath_exp(PyObject *module, PyObject *arg)
Brett Cannonb0fc4902014-10-14 17:37:02 -0400363{
364 PyObject *return_value = NULL;
365 Py_complex z;
366 Py_complex _return_value;
367
Serhiy Storchaka32d96a22018-12-25 13:23:47 +0200368 z = PyComplex_AsCComplex(arg);
369 if (PyErr_Occurred()) {
Brett Cannonb0fc4902014-10-14 17:37:02 -0400370 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300371 }
Brett Cannonb0fc4902014-10-14 17:37:02 -0400372 /* modifications for z */
373 errno = 0; PyFPE_START_PROTECT("complex function", goto exit);
374 _return_value = cmath_exp_impl(module, z);
375 PyFPE_END_PROTECT(_return_value);
376 if (errno == EDOM) {
377 PyErr_SetString(PyExc_ValueError, "math domain error");
378 goto exit;
379 }
380 else if (errno == ERANGE) {
381 PyErr_SetString(PyExc_OverflowError, "math range error");
382 goto exit;
383 }
384 else {
385 return_value = PyComplex_FromCComplex(_return_value);
386 }
387
388exit:
389 return return_value;
390}
391
392PyDoc_STRVAR(cmath_log10__doc__,
393"log10($module, z, /)\n"
394"--\n"
395"\n"
396"Return the base-10 logarithm of z.");
397
398#define CMATH_LOG10_METHODDEF \
Serhiy Storchaka92e8af62015-04-04 00:12:11 +0300399 {"log10", (PyCFunction)cmath_log10, METH_O, cmath_log10__doc__},
Brett Cannonb0fc4902014-10-14 17:37:02 -0400400
401static Py_complex
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300402cmath_log10_impl(PyObject *module, Py_complex z);
Brett Cannonb0fc4902014-10-14 17:37:02 -0400403
404static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300405cmath_log10(PyObject *module, PyObject *arg)
Brett Cannonb0fc4902014-10-14 17:37:02 -0400406{
407 PyObject *return_value = NULL;
408 Py_complex z;
409 Py_complex _return_value;
410
Serhiy Storchaka32d96a22018-12-25 13:23:47 +0200411 z = PyComplex_AsCComplex(arg);
412 if (PyErr_Occurred()) {
Brett Cannonb0fc4902014-10-14 17:37:02 -0400413 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300414 }
Brett Cannonb0fc4902014-10-14 17:37:02 -0400415 /* modifications for z */
416 errno = 0; PyFPE_START_PROTECT("complex function", goto exit);
417 _return_value = cmath_log10_impl(module, z);
418 PyFPE_END_PROTECT(_return_value);
419 if (errno == EDOM) {
420 PyErr_SetString(PyExc_ValueError, "math domain error");
421 goto exit;
422 }
423 else if (errno == ERANGE) {
424 PyErr_SetString(PyExc_OverflowError, "math range error");
425 goto exit;
426 }
427 else {
428 return_value = PyComplex_FromCComplex(_return_value);
429 }
430
431exit:
432 return return_value;
433}
434
435PyDoc_STRVAR(cmath_sin__doc__,
436"sin($module, z, /)\n"
437"--\n"
438"\n"
439"Return the sine of z.");
440
441#define CMATH_SIN_METHODDEF \
Serhiy Storchaka92e8af62015-04-04 00:12:11 +0300442 {"sin", (PyCFunction)cmath_sin, METH_O, cmath_sin__doc__},
Brett Cannonb0fc4902014-10-14 17:37:02 -0400443
444static Py_complex
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300445cmath_sin_impl(PyObject *module, Py_complex z);
Brett Cannonb0fc4902014-10-14 17:37:02 -0400446
447static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300448cmath_sin(PyObject *module, PyObject *arg)
Brett Cannonb0fc4902014-10-14 17:37:02 -0400449{
450 PyObject *return_value = NULL;
451 Py_complex z;
452 Py_complex _return_value;
453
Serhiy Storchaka32d96a22018-12-25 13:23:47 +0200454 z = PyComplex_AsCComplex(arg);
455 if (PyErr_Occurred()) {
Brett Cannonb0fc4902014-10-14 17:37:02 -0400456 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300457 }
Brett Cannonb0fc4902014-10-14 17:37:02 -0400458 /* modifications for z */
459 errno = 0; PyFPE_START_PROTECT("complex function", goto exit);
460 _return_value = cmath_sin_impl(module, z);
461 PyFPE_END_PROTECT(_return_value);
462 if (errno == EDOM) {
463 PyErr_SetString(PyExc_ValueError, "math domain error");
464 goto exit;
465 }
466 else if (errno == ERANGE) {
467 PyErr_SetString(PyExc_OverflowError, "math range error");
468 goto exit;
469 }
470 else {
471 return_value = PyComplex_FromCComplex(_return_value);
472 }
473
474exit:
475 return return_value;
476}
477
478PyDoc_STRVAR(cmath_sinh__doc__,
479"sinh($module, z, /)\n"
480"--\n"
481"\n"
482"Return the hyperbolic sine of z.");
483
484#define CMATH_SINH_METHODDEF \
Serhiy Storchaka92e8af62015-04-04 00:12:11 +0300485 {"sinh", (PyCFunction)cmath_sinh, METH_O, cmath_sinh__doc__},
Brett Cannonb0fc4902014-10-14 17:37:02 -0400486
487static Py_complex
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300488cmath_sinh_impl(PyObject *module, Py_complex z);
Brett Cannonb0fc4902014-10-14 17:37:02 -0400489
490static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300491cmath_sinh(PyObject *module, PyObject *arg)
Brett Cannonb0fc4902014-10-14 17:37:02 -0400492{
493 PyObject *return_value = NULL;
494 Py_complex z;
495 Py_complex _return_value;
496
Serhiy Storchaka32d96a22018-12-25 13:23:47 +0200497 z = PyComplex_AsCComplex(arg);
498 if (PyErr_Occurred()) {
Brett Cannonb0fc4902014-10-14 17:37:02 -0400499 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300500 }
Brett Cannonb0fc4902014-10-14 17:37:02 -0400501 /* modifications for z */
502 errno = 0; PyFPE_START_PROTECT("complex function", goto exit);
503 _return_value = cmath_sinh_impl(module, z);
504 PyFPE_END_PROTECT(_return_value);
505 if (errno == EDOM) {
506 PyErr_SetString(PyExc_ValueError, "math domain error");
507 goto exit;
508 }
509 else if (errno == ERANGE) {
510 PyErr_SetString(PyExc_OverflowError, "math range error");
511 goto exit;
512 }
513 else {
514 return_value = PyComplex_FromCComplex(_return_value);
515 }
516
517exit:
518 return return_value;
519}
520
521PyDoc_STRVAR(cmath_sqrt__doc__,
522"sqrt($module, z, /)\n"
523"--\n"
524"\n"
525"Return the square root of z.");
526
527#define CMATH_SQRT_METHODDEF \
Serhiy Storchaka92e8af62015-04-04 00:12:11 +0300528 {"sqrt", (PyCFunction)cmath_sqrt, METH_O, cmath_sqrt__doc__},
Brett Cannonb0fc4902014-10-14 17:37:02 -0400529
530static Py_complex
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300531cmath_sqrt_impl(PyObject *module, Py_complex z);
Brett Cannonb0fc4902014-10-14 17:37:02 -0400532
533static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300534cmath_sqrt(PyObject *module, PyObject *arg)
Brett Cannonb0fc4902014-10-14 17:37:02 -0400535{
536 PyObject *return_value = NULL;
537 Py_complex z;
538 Py_complex _return_value;
539
Serhiy Storchaka32d96a22018-12-25 13:23:47 +0200540 z = PyComplex_AsCComplex(arg);
541 if (PyErr_Occurred()) {
Brett Cannonb0fc4902014-10-14 17:37:02 -0400542 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300543 }
Brett Cannonb0fc4902014-10-14 17:37:02 -0400544 /* modifications for z */
545 errno = 0; PyFPE_START_PROTECT("complex function", goto exit);
546 _return_value = cmath_sqrt_impl(module, z);
547 PyFPE_END_PROTECT(_return_value);
548 if (errno == EDOM) {
549 PyErr_SetString(PyExc_ValueError, "math domain error");
550 goto exit;
551 }
552 else if (errno == ERANGE) {
553 PyErr_SetString(PyExc_OverflowError, "math range error");
554 goto exit;
555 }
556 else {
557 return_value = PyComplex_FromCComplex(_return_value);
558 }
559
560exit:
561 return return_value;
562}
563
564PyDoc_STRVAR(cmath_tan__doc__,
565"tan($module, z, /)\n"
566"--\n"
567"\n"
568"Return the tangent of z.");
569
570#define CMATH_TAN_METHODDEF \
Serhiy Storchaka92e8af62015-04-04 00:12:11 +0300571 {"tan", (PyCFunction)cmath_tan, METH_O, cmath_tan__doc__},
Brett Cannonb0fc4902014-10-14 17:37:02 -0400572
573static Py_complex
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300574cmath_tan_impl(PyObject *module, Py_complex z);
Brett Cannonb0fc4902014-10-14 17:37:02 -0400575
576static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300577cmath_tan(PyObject *module, PyObject *arg)
Brett Cannonb0fc4902014-10-14 17:37:02 -0400578{
579 PyObject *return_value = NULL;
580 Py_complex z;
581 Py_complex _return_value;
582
Serhiy Storchaka32d96a22018-12-25 13:23:47 +0200583 z = PyComplex_AsCComplex(arg);
584 if (PyErr_Occurred()) {
Brett Cannonb0fc4902014-10-14 17:37:02 -0400585 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300586 }
Brett Cannonb0fc4902014-10-14 17:37:02 -0400587 /* modifications for z */
588 errno = 0; PyFPE_START_PROTECT("complex function", goto exit);
589 _return_value = cmath_tan_impl(module, z);
590 PyFPE_END_PROTECT(_return_value);
591 if (errno == EDOM) {
592 PyErr_SetString(PyExc_ValueError, "math domain error");
593 goto exit;
594 }
595 else if (errno == ERANGE) {
596 PyErr_SetString(PyExc_OverflowError, "math range error");
597 goto exit;
598 }
599 else {
600 return_value = PyComplex_FromCComplex(_return_value);
601 }
602
603exit:
604 return return_value;
605}
606
607PyDoc_STRVAR(cmath_tanh__doc__,
608"tanh($module, z, /)\n"
609"--\n"
610"\n"
611"Return the hyperbolic tangent of z.");
612
613#define CMATH_TANH_METHODDEF \
Serhiy Storchaka92e8af62015-04-04 00:12:11 +0300614 {"tanh", (PyCFunction)cmath_tanh, METH_O, cmath_tanh__doc__},
Brett Cannonb0fc4902014-10-14 17:37:02 -0400615
616static Py_complex
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300617cmath_tanh_impl(PyObject *module, Py_complex z);
Brett Cannonb0fc4902014-10-14 17:37:02 -0400618
619static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300620cmath_tanh(PyObject *module, PyObject *arg)
Brett Cannonb0fc4902014-10-14 17:37:02 -0400621{
622 PyObject *return_value = NULL;
623 Py_complex z;
624 Py_complex _return_value;
625
Serhiy Storchaka32d96a22018-12-25 13:23:47 +0200626 z = PyComplex_AsCComplex(arg);
627 if (PyErr_Occurred()) {
Brett Cannonb0fc4902014-10-14 17:37:02 -0400628 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300629 }
Brett Cannonb0fc4902014-10-14 17:37:02 -0400630 /* modifications for z */
631 errno = 0; PyFPE_START_PROTECT("complex function", goto exit);
632 _return_value = cmath_tanh_impl(module, z);
633 PyFPE_END_PROTECT(_return_value);
634 if (errno == EDOM) {
635 PyErr_SetString(PyExc_ValueError, "math domain error");
636 goto exit;
637 }
638 else if (errno == ERANGE) {
639 PyErr_SetString(PyExc_OverflowError, "math range error");
640 goto exit;
641 }
642 else {
643 return_value = PyComplex_FromCComplex(_return_value);
644 }
645
646exit:
647 return return_value;
648}
649
650PyDoc_STRVAR(cmath_log__doc__,
651"log($module, x, y_obj=None, /)\n"
652"--\n"
653"\n"
654"The logarithm of z to the given base.\n"
655"\n"
656"If the base not specified, returns the natural logarithm (base e) of z.");
657
658#define CMATH_LOG_METHODDEF \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +0200659 {"log", (PyCFunction)(void(*)(void))cmath_log, METH_FASTCALL, cmath_log__doc__},
Brett Cannonb0fc4902014-10-14 17:37:02 -0400660
661static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300662cmath_log_impl(PyObject *module, Py_complex x, PyObject *y_obj);
Brett Cannonb0fc4902014-10-14 17:37:02 -0400663
664static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +0200665cmath_log(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
Brett Cannonb0fc4902014-10-14 17:37:02 -0400666{
667 PyObject *return_value = NULL;
668 Py_complex x;
669 PyObject *y_obj = NULL;
670
Serhiy Storchaka4fa95912019-01-11 16:01:14 +0200671 if (!_PyArg_CheckPositional("log", nargs, 1, 2)) {
Victor Stinner259f0e42017-01-17 01:35:17 +0100672 goto exit;
673 }
Serhiy Storchaka4fa95912019-01-11 16:01:14 +0200674 x = PyComplex_AsCComplex(args[0]);
675 if (PyErr_Occurred()) {
676 goto exit;
677 }
678 if (nargs < 2) {
679 goto skip_optional;
680 }
681 y_obj = args[1];
682skip_optional:
Brett Cannonb0fc4902014-10-14 17:37:02 -0400683 return_value = cmath_log_impl(module, x, y_obj);
684
685exit:
686 return return_value;
687}
688
689PyDoc_STRVAR(cmath_phase__doc__,
690"phase($module, z, /)\n"
691"--\n"
692"\n"
693"Return argument, also known as the phase angle, of a complex.");
694
695#define CMATH_PHASE_METHODDEF \
Serhiy Storchaka92e8af62015-04-04 00:12:11 +0300696 {"phase", (PyCFunction)cmath_phase, METH_O, cmath_phase__doc__},
Brett Cannonb0fc4902014-10-14 17:37:02 -0400697
698static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300699cmath_phase_impl(PyObject *module, Py_complex z);
Brett Cannonb0fc4902014-10-14 17:37:02 -0400700
701static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300702cmath_phase(PyObject *module, PyObject *arg)
Brett Cannonb0fc4902014-10-14 17:37:02 -0400703{
704 PyObject *return_value = NULL;
705 Py_complex z;
706
Serhiy Storchaka32d96a22018-12-25 13:23:47 +0200707 z = PyComplex_AsCComplex(arg);
708 if (PyErr_Occurred()) {
Brett Cannonb0fc4902014-10-14 17:37:02 -0400709 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300710 }
Brett Cannonb0fc4902014-10-14 17:37:02 -0400711 return_value = cmath_phase_impl(module, z);
712
713exit:
714 return return_value;
715}
716
717PyDoc_STRVAR(cmath_polar__doc__,
718"polar($module, z, /)\n"
719"--\n"
720"\n"
721"Convert a complex from rectangular coordinates to polar coordinates.\n"
722"\n"
723"r is the distance from 0 and phi the phase angle.");
724
725#define CMATH_POLAR_METHODDEF \
Serhiy Storchaka92e8af62015-04-04 00:12:11 +0300726 {"polar", (PyCFunction)cmath_polar, METH_O, cmath_polar__doc__},
Brett Cannonb0fc4902014-10-14 17:37:02 -0400727
728static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300729cmath_polar_impl(PyObject *module, Py_complex z);
Brett Cannonb0fc4902014-10-14 17:37:02 -0400730
731static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300732cmath_polar(PyObject *module, PyObject *arg)
Brett Cannonb0fc4902014-10-14 17:37:02 -0400733{
734 PyObject *return_value = NULL;
735 Py_complex z;
736
Serhiy Storchaka32d96a22018-12-25 13:23:47 +0200737 z = PyComplex_AsCComplex(arg);
738 if (PyErr_Occurred()) {
Brett Cannonb0fc4902014-10-14 17:37:02 -0400739 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300740 }
Brett Cannonb0fc4902014-10-14 17:37:02 -0400741 return_value = cmath_polar_impl(module, z);
742
743exit:
744 return return_value;
745}
746
747PyDoc_STRVAR(cmath_rect__doc__,
748"rect($module, r, phi, /)\n"
749"--\n"
750"\n"
751"Convert from polar coordinates to rectangular coordinates.");
752
753#define CMATH_RECT_METHODDEF \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +0200754 {"rect", (PyCFunction)(void(*)(void))cmath_rect, METH_FASTCALL, cmath_rect__doc__},
Brett Cannonb0fc4902014-10-14 17:37:02 -0400755
756static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300757cmath_rect_impl(PyObject *module, double r, double phi);
Brett Cannonb0fc4902014-10-14 17:37:02 -0400758
759static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +0200760cmath_rect(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
Brett Cannonb0fc4902014-10-14 17:37:02 -0400761{
762 PyObject *return_value = NULL;
763 double r;
764 double phi;
765
Serhiy Storchaka4fa95912019-01-11 16:01:14 +0200766 if (!_PyArg_CheckPositional("rect", nargs, 2, 2)) {
767 goto exit;
768 }
769 r = PyFloat_AsDouble(args[0]);
770 if (PyErr_Occurred()) {
771 goto exit;
772 }
773 phi = PyFloat_AsDouble(args[1]);
774 if (PyErr_Occurred()) {
Victor Stinner259f0e42017-01-17 01:35:17 +0100775 goto exit;
776 }
Brett Cannonb0fc4902014-10-14 17:37:02 -0400777 return_value = cmath_rect_impl(module, r, phi);
778
779exit:
780 return return_value;
781}
782
783PyDoc_STRVAR(cmath_isfinite__doc__,
784"isfinite($module, z, /)\n"
785"--\n"
786"\n"
787"Return True if both the real and imaginary parts of z are finite, else False.");
788
789#define CMATH_ISFINITE_METHODDEF \
Serhiy Storchaka92e8af62015-04-04 00:12:11 +0300790 {"isfinite", (PyCFunction)cmath_isfinite, METH_O, cmath_isfinite__doc__},
Brett Cannonb0fc4902014-10-14 17:37:02 -0400791
792static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300793cmath_isfinite_impl(PyObject *module, Py_complex z);
Brett Cannonb0fc4902014-10-14 17:37:02 -0400794
795static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300796cmath_isfinite(PyObject *module, PyObject *arg)
Brett Cannonb0fc4902014-10-14 17:37:02 -0400797{
798 PyObject *return_value = NULL;
799 Py_complex z;
800
Serhiy Storchaka32d96a22018-12-25 13:23:47 +0200801 z = PyComplex_AsCComplex(arg);
802 if (PyErr_Occurred()) {
Brett Cannonb0fc4902014-10-14 17:37:02 -0400803 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300804 }
Brett Cannonb0fc4902014-10-14 17:37:02 -0400805 return_value = cmath_isfinite_impl(module, z);
806
807exit:
808 return return_value;
809}
810
811PyDoc_STRVAR(cmath_isnan__doc__,
812"isnan($module, z, /)\n"
813"--\n"
814"\n"
815"Checks if the real or imaginary part of z not a number (NaN).");
816
817#define CMATH_ISNAN_METHODDEF \
Serhiy Storchaka92e8af62015-04-04 00:12:11 +0300818 {"isnan", (PyCFunction)cmath_isnan, METH_O, cmath_isnan__doc__},
Brett Cannonb0fc4902014-10-14 17:37:02 -0400819
820static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300821cmath_isnan_impl(PyObject *module, Py_complex z);
Brett Cannonb0fc4902014-10-14 17:37:02 -0400822
823static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300824cmath_isnan(PyObject *module, PyObject *arg)
Brett Cannonb0fc4902014-10-14 17:37:02 -0400825{
826 PyObject *return_value = NULL;
827 Py_complex z;
828
Serhiy Storchaka32d96a22018-12-25 13:23:47 +0200829 z = PyComplex_AsCComplex(arg);
830 if (PyErr_Occurred()) {
Brett Cannonb0fc4902014-10-14 17:37:02 -0400831 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300832 }
Brett Cannonb0fc4902014-10-14 17:37:02 -0400833 return_value = cmath_isnan_impl(module, z);
834
835exit:
836 return return_value;
837}
838
839PyDoc_STRVAR(cmath_isinf__doc__,
840"isinf($module, z, /)\n"
841"--\n"
842"\n"
843"Checks if the real or imaginary part of z is infinite.");
844
845#define CMATH_ISINF_METHODDEF \
Serhiy Storchaka92e8af62015-04-04 00:12:11 +0300846 {"isinf", (PyCFunction)cmath_isinf, METH_O, cmath_isinf__doc__},
Brett Cannonb0fc4902014-10-14 17:37:02 -0400847
848static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300849cmath_isinf_impl(PyObject *module, Py_complex z);
Brett Cannonb0fc4902014-10-14 17:37:02 -0400850
851static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300852cmath_isinf(PyObject *module, PyObject *arg)
Brett Cannonb0fc4902014-10-14 17:37:02 -0400853{
854 PyObject *return_value = NULL;
855 Py_complex z;
856
Serhiy Storchaka32d96a22018-12-25 13:23:47 +0200857 z = PyComplex_AsCComplex(arg);
858 if (PyErr_Occurred()) {
Brett Cannonb0fc4902014-10-14 17:37:02 -0400859 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300860 }
Brett Cannonb0fc4902014-10-14 17:37:02 -0400861 return_value = cmath_isinf_impl(module, z);
862
863exit:
864 return return_value;
865}
Tal Einatd5519ed2015-05-31 22:05:00 +0300866
867PyDoc_STRVAR(cmath_isclose__doc__,
868"isclose($module, /, a, b, *, rel_tol=1e-09, abs_tol=0.0)\n"
869"--\n"
870"\n"
871"Determine whether two complex numbers are close in value.\n"
872"\n"
873" rel_tol\n"
874" maximum difference for being considered \"close\", relative to the\n"
875" magnitude of the input values\n"
876" abs_tol\n"
877" maximum difference for being considered \"close\", regardless of the\n"
878" magnitude of the input values\n"
879"\n"
880"Return True if a is close in value to b, and False otherwise.\n"
881"\n"
882"For the values to be considered close, the difference between them must be\n"
883"smaller than at least one of the tolerances.\n"
884"\n"
885"-inf, inf and NaN behave similarly to the IEEE 754 Standard. That is, NaN is\n"
886"not close to anything, even itself. inf and -inf are only close to themselves.");
887
888#define CMATH_ISCLOSE_METHODDEF \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +0200889 {"isclose", (PyCFunction)(void(*)(void))cmath_isclose, METH_FASTCALL|METH_KEYWORDS, cmath_isclose__doc__},
Tal Einatd5519ed2015-05-31 22:05:00 +0300890
891static int
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300892cmath_isclose_impl(PyObject *module, Py_complex a, Py_complex b,
Tal Einatd5519ed2015-05-31 22:05:00 +0300893 double rel_tol, double abs_tol);
894
895static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +0200896cmath_isclose(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Tal Einatd5519ed2015-05-31 22:05:00 +0300897{
898 PyObject *return_value = NULL;
Serhiy Storchaka9171a8b2016-08-14 10:52:18 +0300899 static const char * const _keywords[] = {"a", "b", "rel_tol", "abs_tol", NULL};
900 static _PyArg_Parser _parser = {"DD|$dd:isclose", _keywords, 0};
Tal Einatd5519ed2015-05-31 22:05:00 +0300901 Py_complex a;
902 Py_complex b;
903 double rel_tol = 1e-09;
904 double abs_tol = 0.0;
905 int _return_value;
906
Victor Stinner3e1fad62017-01-17 01:29:01 +0100907 if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser,
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300908 &a, &b, &rel_tol, &abs_tol)) {
Tal Einatd5519ed2015-05-31 22:05:00 +0300909 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300910 }
Tal Einatd5519ed2015-05-31 22:05:00 +0300911 _return_value = cmath_isclose_impl(module, a, b, rel_tol, abs_tol);
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300912 if ((_return_value == -1) && PyErr_Occurred()) {
Tal Einatd5519ed2015-05-31 22:05:00 +0300913 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300914 }
Tal Einatd5519ed2015-05-31 22:05:00 +0300915 return_value = PyBool_FromLong((long)_return_value);
916
917exit:
918 return return_value;
919}
Serhiy Storchaka4fa95912019-01-11 16:01:14 +0200920/*[clinic end generated code: output=86a365d23f34aaff input=a9049054013a1b77]*/