Improve accuracy for complex powers with small negative integer exponents
Nadie ha tomado este issue todavía.
- Lenguaje dominante
- Python
- Estrellas
- 77.2k
- Forks
- 35.9k
- Métricas de merge de PR
- Métricas de PR pendientes
Descripción
Feature or enhancement
Proposal:
Currently we compute such powers as (1+0j)/z**(-n) (unless absolute value of n is too big to use specialized algorithm for integer exponents). This approach, however, introduce huge accuracy loss due to underflows in division.
For example:
>>> from gmpy2 import *
>>> import math
>>> x, y = map(float.fromhex, ['0x1.47e9c711723f5p+81',
... '0x1.38afd1168e49fp+85'])
>>> z = complex(x, y)
>>> pr = pow(z, -12); pr
0j
>>> pr2 = pow((1/z), 12); pr2
(5.562684646267994e-309+5.56268464626799e-309j)
>>> gr = complex(pow(mpc(z), -12))
>>> abs((pr2-gr).real)/math.ulp(gr.real)
2.0
>>> abs((pr2-gr).imag)/math.ulp(gr.imag)
2.0
Using instead ((1+0j)/z)**(-n) reduced error in this example from ~1e15 ULP to 2ULP. Note that, generic power algorithm is not affected by this issue:
>>> import _testcapi
>>> pr3 = _testcapi._py_c_pow(z, -12)[0]; pr3
(5.56268464626801e-309+5.56268464626799e-309j)
>>> abs((pr3-gr).real)/math.ulp(gr.real)
1.0
>>> abs((pr3-gr).imag)/math.ulp(gr.imag)
2.0
Has this already been discussed elsewhere?
This is a minor feature, which does not need previous discussion elsewhere
Links to previous discussion of this feature:
No response
Linked PRs
- gh-156757
- gh-156968
Guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Línea de trabajo
Comienza con las rutas de potencias complejas ejercitadas por pow(z, -12) y _testcapi._py_c_pow, comparándolas con pow((1/z), 12) y el resultado de mpc mostrado en el reproductor. Se considera terminado cuando se evite la pérdida de precisión provocada por el underflow en el ejemplo; revisa los PR enlazados gh-156757 y gh-156968 antes de continuar.
Escrito por el modelo de indexación a partir del texto del issue.
Evaluación
- Stack tecnológico
- python
- Área
- backend
- Tipo de issue
- Nueva funcionalidad
- Dificultad
- 4/5
- Tiempo estimado
- 3-5 días
- Estado de actividad
- Estancado
- Claridad
- Bastante claro
- Aptitud para principiantes
- 25/100