ld128 coshl mishandles tiny inputs
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 2/5
- Tiempo estimado
- 1-3 horas
- Aptitud para principiantes
- 48/100
Línea de trabajo
Comienza ejecutando el programa de prueba AArch64 proporcionado e inspecciona la rama de salida temprana para entradas diminutas en ld128/e_coshl.c. Compara su resultado con el comportamiento esperado de cosh(ε) y añade o actualiza cobertura específica para que la implementación devuelva correctamente el resultado para entradas alrededor de 2^-116; se considera terminado cuando las salidas para entradas pequeñas ya no muestran los valores erróneos.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
The following test program computes cosh of 1, 1/2, 1/4, ..., 1/2^-128.
#include <stdio.h>
#include <math.h>
int main(int argc, char **argv) {
long double d = 1.0;
for (int i = 0; i < 128; i++) {
printf("coshl(%La) = %La\n", d, coshl(d));
d /= 2;
}
}
For small ε, cosh(ε) ≈ 1+ε^2/2. So if we run on AArch64, which has 128-bit long doubles with a 112-bit mantissa, we expect that by the time the input is about 2^-56, the output will be indistinguishable from 1. And indeed this looks sensible to start off with:
coshl(0x1p-54) = 0x1.0000000000000000000000000008p+0
coshl(0x1p-55) = 0x1.0000000000000000000000000002p+0
coshl(0x1p-56) = 0x1p+0
coshl(0x1p-57) = 0x1p+0
but a little bit later, the outputs unexpectedly become wrong:
coshl(0x1p-71) = 0x1p+0
coshl(0x1p-72) = 0x1.000000000000000001p+0
coshl(0x1p-73) = 0x1.0000000000000000008p+0
coshl(0x1p-74) = 0x1.0000000000000000004p+0
coshl(0x1p-75) = 0x1.0000000000000000002p+0
coshl(0x1p-76) = 0x1.0000000000000000001p+0
It looks as if the early exit code path from this special case in ld128/e_coshl.c is absent-mindedly returning the wrong variable:
if (ex < 0x3fb80000) /* |x| < 2^-116 */
return w; /* cosh(tiny) = 1 */
But w is not 1: it's 1 + expm1(input), i.e. about exp(input), i.e. about 1+input (for small inputs).
- Lenguaje dominante
- C
- Estrellas
- 632
- Forks
- 163
- Merge medio
- 4 min
- PR fusionados (30 d)
- 1
Preparar el entorno
Aún no hemos revisado los archivos de configuración de este proyecto. Empieza por su README y consulta nuestra guía para la primera contribución para los pasos generales.
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.
Más de JuliaMath/openlibm
-
Dificultad 4/5 3-5 días Aptitud para principiantes 38/100
-
Dificultad 5/5 Más de una semana Aptitud para principiantes 25/100
-
issues found by openlibm-testAbierto
Dificultad 4/5 3-5 días Aptitud para principiantes 35/100
-
Dificultad 3/5 1-2 días Aptitud para principiantes 45/100
-
Sync patches from upstream (BSD)Abierto
Dificultad 4/5 3-5 días Aptitud para principiantes 35/100
Todos los issues de JuliaMath/openlibm
Issues similares
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 68/100
trezor/trezor-firmware#7997 ·
Los mantenedores suelen responder en 2 días
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 84/100
Los mantenedores suelen responder en 1 día
-
area/ysql kind/bug priority/medium status/awaiting-triage
Dificultad 2/5 1-3 horas Aptitud para principiantes 84/100
yugabyte/yugabyte-db#34415 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 1/5 1-3 horas Aptitud para principiantes 78/100
KhronosGroup/OpenCL-Headers#318 ·
-
Build failure: mumbleAbierto0.kind: build failure
Dificultad 2/5 1-3 horas Aptitud para principiantes 73/100
Los mantenedores suelen responder en 1 día