Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

gh-117999: fixed small nonnegative integer powers of complex numbers #118000

Closed
wants to merge 7 commits into from

Conversation

skirpichev
Copy link
Member

@skirpichev skirpichev commented Apr 17, 2024

Before, handling of numbers with special values in components (infinities, nans, signed zero) was invalid. Simple example:

    >>> z = complex(1, -0.0)
    >>> z*z
    (1-0j)
    >>> z**2
    (1+0j)

Now:

    >>> z**2
    (1-0j)

@skirpichev skirpichev force-pushed the fix-c_powi-117999 branch 2 times, most recently from 2a6babf to 5ee43ee Compare April 18, 2024 08:49
@skirpichev skirpichev changed the title gh-117999: fixed invalid small integer powers of real±0j gh-117999: fixed small nonnegative integer powers of complex numbers with special components Apr 24, 2024
@skirpichev skirpichev force-pushed the fix-c_powi-117999 branch 2 times, most recently from 51c6cad to cd3e11e Compare May 12, 2024 17:00
@skirpichev skirpichev changed the title gh-117999: fixed small nonnegative integer powers of complex numbers with special components gh-117999: fixed small nonnegative integer powers of complex numbers May 12, 2024
…mbers

Before, handling of numbers with special values in components
(infinities, nans, signed zero) was invalid.  Simple example:

    >>> z = complex(1, -0.0)
    >>> z*z
    (1-0j)
    >>> z**2
    (1+0j)

Now:

    >>> z**2
    (1-0j)
@skirpichev
Copy link
Member Author

@picnixz, I would appreciate your review on this pr. Or your opinion in the issue thread.

@picnixz
Copy link
Contributor

picnixz commented Aug 18, 2024

I'll do it tomorrow! (Monday, Paris time)

@picnixz picnixz self-requested a review August 18, 2024 13:54
Lib/test/test_complex.py Outdated Show resolved Hide resolved
Lib/test/test_complex.py Outdated Show resolved Hide resolved
Lib/test/test_complex.py Outdated Show resolved Hide resolved
Lib/test/test_complex.py Outdated Show resolved Hide resolved
Lib/test/test_complex.py Outdated Show resolved Hide resolved
Objects/complexobject.c Outdated Show resolved Hide resolved
Lib/test/test_complex.py Outdated Show resolved Hide resolved
@picnixz
Copy link
Contributor

picnixz commented Aug 19, 2024

I need to think a bit more on the issue. I'll try to have something by the end of the day or tomorrow. Ideally, I would like to have no inconsistency between the generic algorithm and the non-generic one (namely, the result should be as if we were using the generic algorithm).

@skirpichev
Copy link
Member Author

skirpichev commented Aug 19, 2024

I would like to have no inconsistency between the generic algorithm and the non-generic one

I'm not sure if it's possible without too much code, that affects performance severely. BTW, I think that numpy code has no such special version for integer exponents. I'll double check.

Edit: Ah, no. numpy mimics CPython here, at least in npy_math_complex.c.src.

Edit2:

JFR, some simple benchmarks.

With specialized code (main):

$ python -m pyperf timeit -q -s 'z=1+1j;e=20' 'pow(z,e)'
Mean +- std dev: 237 ns +- 5 ns
$ python -m pyperf timeit -q -s 'z=1+1j;e=90' 'pow(z,e)'
Mean +- std dev: 259 ns +- 4 ns
$ python -m pyperf timeit -q -s 'z=1+1j;e=110' 'pow(z,e)'
Mean +- std dev: 579 ns +- 5 ns
$ python -m pyperf timeit -q -s 'z=1+1j;e=200' 'pow(z,e)'
Mean +- std dev: 571 ns +- 3 ns

Without:

$ python -m pyperf timeit -q -s 'z=1+1j;e=2' 'pow(z,e)'
Mean +- std dev: 562 ns +- 3 ns
$ python -m pyperf timeit -q -s 'z=1+1j;e=20' 'pow(z,e)'
Mean +- std dev: 576 ns +- 2 ns
$ python -m pyperf timeit -q -s 'z=1+1j;e=90' 'pow(z,e)'
Mean +- std dev: 576 ns +- 3 ns
$ python -m pyperf timeit -q -s 'z=1+1j;e=110' 'pow(z,e)'
Mean +- std dev: 578 ns +- 4 ns
$ python -m pyperf timeit -q -s 'z=1+1j;e=200' 'pow(z,e)'
Mean +- std dev: 573 ns +- 3 ns

Lib/test/test_complex.py Outdated Show resolved Hide resolved
Objects/complexobject.c Outdated Show resolved Hide resolved
Lib/test/test_complex.py Outdated Show resolved Hide resolved
Lib/test/test_complex.py Outdated Show resolved Hide resolved
@skirpichev skirpichev closed this Aug 20, 2024
@skirpichev skirpichev deleted the fix-c_powi-117999 branch August 20, 2024 03:29
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants