Re: gcc sort

Top Page

Reply to this message
Author: Pierre Mazein
Date:  
To: guilde
Subject: Re: gcc sort
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
> ===========================================================================

>
>