Hello,
In this example, if I put a 0, the sorting is wrong which must be standard c
After sorting the list is: 0 -5.5e-06 3 25 56 88 100 -5.5e-06 2 3 25 56 88 100
#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@gmx.com Laboratoire interdisciplinaire Carnot de Bourgogne 9 Avenue Alain Savary, BP 47870, 21078 DIJON Cedex FRANCE Tel: +33 (0)380395988 ===========================================================================
your function indeed needs to return an int, but the computation doesn't look like an int.
you will need to compare, and return one of -1,0,1, not subtract the values.
On 3/5/20 8:22 AM, Patrick Dupre wrote:
Hello,
In this example, if I put a 0, the sorting is wrong which must be standard c
After sorting the list is: 0 -5.5e-06 3 25 56 88 100 -5.5e-06 2 3 25 56 88 100
#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@gmx.com Laboratoire interdisciplinaire Carnot de Bourgogne 9 Avenue Alain Savary, BP 47870, 21078 DIJON Cedex FRANCE Tel: +33 (0)380395988 =========================================================================== _______________________________________________ users mailing list -- users@lists.fedoraproject.org To unsubscribe send an email to users-leave@lists.fedoraproject.org Fedora Code of Conduct: https://docs.fedoraproject.org/en-US/project/code-of-conduct/ List Guidelines: https://fedoraproject.org/wiki/Mailing_list_guidelines List Archives: https://lists.fedoraproject.org/archives/list/users@lists.fedoraproject.org
On Thu, Mar 05, 2020 at 02:22:03PM +0100, Patrick Dupre wrote:
After sorting the list is: 0 -5.5e-06 3 25 56 88 100 -5.5e-06 2 3 25 56 88 100
#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 );
The comparison function is bad (at least for the possible values). First of all, if the difference between the two doubles doesn't fit into int, then it is undefined behavior. That is not what you run into here though. The problem you run into is that the double -> int conversion is truncating toward zero, so if there is a difference, but smaller in absolute value than 1.0, the comparison function returns 0 as if the two values were the same. So at least you want something like: double t = *(double*)a - *(double*)b; if (t < 0) return -1; if (t > 0) return 1; return 0; the rest depends on what ordering you exactly want, e.g. if you want to order -0.0 before 0.0 or don't care, or what you want to do with NaNs/sNaNs etc.
Jakub