[supprimé]
- Modifié
EDIT2:
Bug corrigé avec la dernière mise à jour de libc6.
EDIT:
Le bug est confirmé dans la librairie : https://sourceware.org/bugzilla/show_bug.cgi?id=16623
Pas de correction pour le moment dans eglibc 2.19 (mais corrigé dans glibc).
Bonjour à tous,
Ceci ne concerne que Trusty.
Je me suis rendu compte que la librairie C mathématique (libm) donne des résultats faux de cosinus/sinus pour des valeurs importantes de l'angle.
La version de eglibc (qui contient libc6 et libm) dans trusty est la 2.19 sortie en février 2014. Sur debian unstable et experimental, ils sont toujours en version 2.18.
Exemple de calculs faux :
Voici un code C qui permet de tester le bug (bug_libc6_cos.c) :
La libm est utilisée par un tas de logiciels : audacity, octave, matlab ou la calculette gnome. Ils sont donc soumis au même bug. Comme ce bug n'intervient que pour des angles importants (> 10e8 radians) ça limite sa nuisance !
Bug corrigé avec la dernière mise à jour de libc6.
EDIT:
Le bug est confirmé dans la librairie : https://sourceware.org/bugzilla/show_bug.cgi?id=16623
Pas de correction pour le moment dans eglibc 2.19 (mais corrigé dans glibc).
Bonjour à tous,
Ceci ne concerne que Trusty.
Je me suis rendu compte que la librairie C mathématique (libm) donne des résultats faux de cosinus/sinus pour des valeurs importantes de l'angle.
La version de eglibc (qui contient libc6 et libm) dans trusty est la 2.19 sortie en février 2014. Sur debian unstable et experimental, ils sont toujours en version 2.18.
Exemple de calculs faux :
sin(2*pi*0.27*7390843) = -0.63742399 OK
sin(2*pi*2.27*7390843) = 0.63742398 KO
cos(2*pi*0.27*7390879) = -0.48175367 OK
cos(2*pi*2.27*7390879) = 0.48175367 KO
A chaque fois l'angle différe d'un nombre entier élevé de multiple de 2*pi. Mais les résultats devraient être identiques !Voici un code C qui permet de tester le bug (bug_libc6_cos.c) :
/*
* Bug cos() & sin() dans libc6 (libm) ubuntu 14.04
* C'est un bug de la version 2.19 de eglibc (qui contient libc6 et libm)
*/
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#define PRECISION 1e-5
void bug_cos(void)
{
int n;
double c1,c2,s1,s2;
int nerr = 0;
for (n = 0; n < 10000000; n++)
{
/* si pas d'erreur c1 = c2 et s1 = s2 */
c1 = cos(2. * M_PI * 0.27 * (double) n);
c2 = cos(2. * M_PI * 2.27 * (double) n);
s1 = sin(2. * M_PI * 0.27 * (double) n);
s2 = sin(2. * M_PI * 2.27 * (double) n);
/* si |c2 - c1| > PRECISION */
if (fabs(c2-c1) > PRECISION)
{
fprintf(stdout,
"ERR:\n"
" cos(2*pi*0.27*%d) = %12.8f OK\n"
" cos(2*pi*2.27*%d) = %12.8f KO\n",
n,c1,n,c2);
nerr++;
}
/* si |s2 - s1| > PRECISION */
if (fabs(s2-s1) > PRECISION)
{
fprintf(stdout,
"ERR:\n"
" sin(2*pi*0.27*%d) = %12.8f OK\n"
" sin(2*pi*2.27*%d) = %12.8f KO\n",
n,s1,n,s2);
nerr++;
}
/* n'affiche que les premieres erreurs ... */
if (nerr > 4)
{
fprintf(stdout,"ERR : ...\n\n");
break;
}
}
}
int main(int na, char *arg[])
{
bug_cos();
return 0;
}
Pour compiler : gcc -O2 -Wall bug_libc6_cos.c -o bug_libc6_cos -lmLa libm est utilisée par un tas de logiciels : audacity, octave, matlab ou la calculette gnome. Ils sont donc soumis au même bug. Comme ce bug n'intervient que pour des angles importants (> 10e8 radians) ça limite sa nuisance !