Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
5aa9e73
gh-155526: correct errno handling in complex_abs()
skirpichev Aug 11, 2026
9702894
Merge branch 'master' into complex-abs-errno/155526
skirpichev Aug 11, 2026
576f6cd
address review: restore errno + readability
skirpichev Aug 11, 2026
31d9fc3
Merge branch 'master' into complex-abs-errno/155526
skirpichev Aug 27, 2026
3b851ac
+ test special components for complex_abs()
skirpichev Aug 27, 2026
c4f365e
Merge branch 'master' into complex-abs-errno/155526
skirpichev Aug 31, 2026
fde8fc7
+ don't use errno in complex_abs()
skirpichev Aug 31, 2026
5fa214f
ignore errno from atan2 in cmath_polar_impl()
skirpichev Sep 5, 2026
23d948e
Merge branch 'master' into complex-abs-errno/155526
skirpichev Sep 5, 2026
28ba074
restore errno on success
skirpichev Sep 6, 2026
4539933
Merge branch 'master' into complex-abs-errno/155526
skirpichev Sep 8, 2026
ad46155
clarify news
skirpichev Sep 8, 2026
4d3badf
Apply batched suggestions from code review
skirpichev Sep 9, 2026
c0c0657
Merge branch 'master' into complex-abs-errno/155526
skirpichev Sep 9, 2026
6b3219d
address review: versionchanged and whatsnew entry
skirpichev Sep 9, 2026
674b980
Apply batched suggestions from code review
vstinner Sep 9, 2026
7c6cceb
Apply suggestion from @hpkfft
vstinner Sep 9, 2026
8c982dd
Apply suggestion from @skirpichev
skirpichev Sep 10, 2026
386719a
Merge branch 'main' into complex-abs-errno/155526
skirpichev Sep 10, 2026
bf92f8e
Apply suggestion from @skirpichev
skirpichev Sep 10, 2026
c1a6753
Update Doc/c-api/complex.rst
skirpichev Sep 10, 2026
654cc70
address review: split news
skirpichev Sep 10, 2026
38eac1f
Merge branch 'master' into complex-abs-errno/155526
skirpichev Sep 10, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
gh-155526: correct errno handling in complex_abs()
  • Loading branch information
skirpichev committed Aug 11, 2026
commit 5aa9e730ecb921fe2dce8179f7cff82dec773977
7 changes: 7 additions & 0 deletions Lib/test/test_complex.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import unittest
import sys
from test import support
from test.support import import_helper
from test.support.testcase import ComplexesAreIdenticalMixin
from test.support.numbers import (
VALID_UNDERSCORE_LITERALS,
Expand Down Expand Up @@ -791,6 +792,12 @@ def test_abs(self):

self.assertRaises(OverflowError, abs, complex(DBL_MAX, DBL_MAX))

def test_abs_errno_handling(self):
_testcapi = import_helper.import_module('_testcapi')
z = complex('nan')
_testcapi.set_errno(34)
Comment thread
skirpichev marked this conversation as resolved.
Outdated
self.assertTrue(isnan(abs(z)))

def test_repr_str(self):
def test(v, expected, test_fn=self.assertEqual):
test_fn(repr(v), expected)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Correct ``errno`` handling in ``abs(complex)``. Patch by Sergey B
Comment thread
skirpichev marked this conversation as resolved.
Outdated
Kirpichev.
14 changes: 7 additions & 7 deletions Objects/complexobject.c
Original file line number Diff line number Diff line change
Expand Up @@ -367,7 +367,7 @@ c_powi(Py_complex x, long n)
double
_Py_c_abs(Py_complex z)
{
/* sets errno = ERANGE on overflow; otherwise errno = 0 */
/* sets errno = ERANGE on overflow */
Comment thread
skirpichev marked this conversation as resolved.
double result;

if (!isfinite(z.real) || !isfinite(z.imag)) {
Expand All @@ -376,23 +376,20 @@ _Py_c_abs(Py_complex z)
NaN. */
if (isinf(z.real)) {
result = fabs(z.real);
errno = 0;
return result;
}
if (isinf(z.imag)) {
result = fabs(z.imag);
errno = 0;
return result;
}
/* either the real or imaginary part is a NaN,
and neither is infinite. Result should be NaN. */
return Py_NAN;
}
result = hypot(z.real, z.imag);
if (!isfinite(result))
if (!isfinite(result)) {
errno = ERANGE;
else
errno = 0;
}
return result;
}

Expand Down Expand Up @@ -796,7 +793,10 @@ static PyObject *
complex_abs(PyObject *op)
{
PyComplexObject *v = _PyComplexObject_CAST(op);
double result = _Py_c_abs(v->cval);
double result;

errno = 0;
result = _Py_c_abs(v->cval);
Comment thread
skirpichev marked this conversation as resolved.
if (errno == ERANGE) {
PyErr_SetString(PyExc_OverflowError,
"absolute value too large");
Expand Down
Loading