Bonjour,
Ca n'est pas qsort qui perd les pédales.
C'est la logique de votre fonction de comparaison qui cale lorsque vous
avez un nombre négatif.
Essayez avec ceci :
int dcmpfunc2 (const void * a, const void * b) {
int c;
if (*(double*)a > *(double*)b)
c=1;
else
c=0;
return ( c );
}
De plus la conversion entre floats et types entier n'est pas parfaite,
donc selon la valeur à convertir, vous pourriez avoir de sales surprises
sur des valeurs très précises et très proches.
Cf :
https://fr.wikipedia.org/wiki/IEEE_754
dans le gros tableau du milieu on voit que 0 est parfaitement codé, mais
le prochain nombre codable est 1,4 × 10−45. Si votre problème fait
sortir le nombre 1,0 × 10−45, il sera approximé en 0 ou 1,4 × 10−45.
Je fais ce commentaire par rapport à l'utilisation de la différence pour
faire la valeur retournée par la fonction. La reconstruction de l'int à
partir du double pourrait être problématique.
Cordialement,
Pierre
Le 05/03/2020 à 14:14, Patrick Dupre a écrit :
> Bonjour,
>
> Est-ce que quelqu'un peut me dire pourquoi dans cet exemple, le fait de mettre un 0
> perturbe qsort ?
>
> #include <stdio.h>
> #include <stdlib.h>
>
> double values[] = { 88, 56, 100, 0.0, 25, 3, -0.55e-5 };
> double values2 [] = { 88, 56, 100, 2, 25, 3, -0.55e-5 };
>
> int dcmpfunc (const void * a, const void * b) {
> return ( *(double*)a - *(double*)b );
> }
>
> int main () {
> int n;
> double *val2 = (double*) malloc (7 * sizeof(double)) ;
> double *val = (double*) malloc (7 * sizeof(double)) ;
> for (n = 0 ; n < 7 ; n++) val [n] = values [n] ;
> for (n = 0 ; n < 7 ; n++) val2 [n] = values2 [n] ;
>
> qsort (val, 7, sizeof (double), dcmpfunc);
> qsort (val2, 7, sizeof (double), dcmpfunc);
>
> printf ("\nAfter sorting the list is: \n") ;
> for (n = 0 ; n < 7; n++ ) printf("%g ", val [n]); printf ("\n") ;
> for (n = 0 ; n < 7; n++ ) printf("%g ", val2 [n]); printf ("\n") ;
>
> return(0);
> }
>
> ===========================================================================
> Patrick DUPRÉ | | email: pdupre@???
> Laboratoire interdisciplinaire Carnot de Bourgogne
> 9 Avenue Alain Savary, BP 47870, 21078 DIJON Cedex FRANCE
> Tel: +33 (0)380395988
> ===========================================================================
>
>