précision de la comparaison des valeurs doubles avec EPSILON en C

Fonction qui prend 2 tableaux (column1 et column2) de la structure CSV D et en trace le graphe.

L’idée est de trouver les valeurs maximales et minimales de chaque tableau, puis de diviser la plage entre min-EPSILON et max + EPSILON dans 600 régions égales, où EPSILON = 10 ^ (- 6).

Le problème est que la fonction ne trace pas correctement la ligne la plus basse. Je pense que le problème est lorsque l’on compare la valeur de array avec min-EPSILON , pas sûr. S’il vous plaît des conseils.

Voici mon code.

void do_plot(CSV *D, int column1, int column2) { #define Y_REGIONS 600 #define X_REGIONS 600 #define EPSILON 0.000001 int col1=column1-1; //since indexing in C language starts from 0, to be more user friendly values increased by 1 int col2=column2-1; double min_y = D->values[0][col1]; //min val of column double max_y = D->values[0][col1]; //max val of column double min_x = D->values[0][col2]; //min val of column double max_x = D->values[0][col2]; //max val of column int i=0,j=0,k=0; //iteration variables double interval_x, interval_y; //region int counter; //counts how many elements of "col1" and "column2" are in bucket int plotval; //plotted value double upper_bound_y[Y_REGIONS+1],lower_bound_y[Y_REGIONS+1]; //arrays for lower and upper bounds of regions in y (added extra 1 not to run out of regions) double upper_bound_x[X_REGIONS+1],lower_bound_x[X_REGIONS+1]; //arrays for lower and upper bounds of regions in x while (i number_of_rows){ if (D->values[i][col1] > max_y){ max_y = D->values[i][col1]; } if (D->values[i][col1] values[i][col1]; } if (D->values[i][col2] > max_x){ max_x = D->values[i][col2]; } if (D->values[i][col2] values[i][col2]; } i++; } /* adding EPSILON val to max and min */ max_x=max_x+EPSILON; max_y=max_y+EPSILON; min_x=min_x-EPSILON; min_y=min_y-EPSILON; interval_y=(max_y-min_y)/Y_REGIONS; //breaking y axis into Y_REGIONS equal regions interval_x=(max_x-min_x)/X_REGIONS; //breaking x axis into Y_REGIONS equal regions /* calculating regions of y*/ upper_bound_y[0]=max_y; //upper bound of the first region in y lower_bound_y[0]=max_y-interval_y; //lower bound of the first region in y for (j=0; j<Y_REGIONS; j++){ upper_bound_y[j+1]=upper_bound_y[j]-interval_y; lower_bound_y[j+1]=lower_bound_y[j]-interval_y; } /* calculating regions of x */ upper_bound_x[0]=min_x+interval_x; //upper bound of the first region in y lower_bound_x[0]=min_x; //lower bound of the first region in y for (j=0; j<X_REGIONS; j++){ upper_bound_x[j+1]=upper_bound_x[j]+interval_x; lower_bound_x[j+1]=lower_bound_x[j]+interval_x; } /* plotting the graph */ for (i=0; i<Y_REGIONS; i++){ printf("\n%6.20lf--%6.20lf: ", lower_bound_y[i], upper_bound_y[i]); //plotting y axis for (j=0; j<X_REGIONS; j++){ //x axis counter=0; //resetting counter while (k number_of_rows){ k++; /* checking whether element of input lies within region and counting number of elements */ if (D->values[k][col1] values[k][col1] > lower_bound_y[i]){ if (D->values[k][col2] values[k][col2] > lower_bound_x[j] ){ counter++; } } } k=0; //resetting counter plotval=floor(log(counter+1)/log(2)); //formula to show number of values in bucket /* plotting x lines */ if (plotval==0){ printf("."); } else{ printf("%d",plotval); } } } printf("\n"); return; } 

Les calculs de limites sont compliqués et ont des trous.

Voir que upper_bound_x[n] == lower_bound_x[n+1] . Ensuite, lorsqu’une comparaison a lieu avec (D->values[k][col2] == upper_bound_x[n] , elle ne s’intégrera ni dans la région n ni dans la région n+1 .

 // Existing code upper_bound_x[0]=min_x+interval_x; //upper bound of the first region in y lower_bound_x[0]=min_x; //lower bound of the first region in y for (j=0; jvalues[k][col2] < upper_bound_x[j] && D->values[k][col2] > lower_bound_x[j] ){ 

Suggérez de réécrire et utilisez un bound_x[X_REGIONS+1] , puis utilisez compare:

 if (D->values[k][col2] >= bound_x[j] && D->values[k][col2] < bound_x[j] ){ 

Alternativement, le code pourrait ignorer les tableaux bound[] (x & y) et calculer les limites à la volée.

Mineur:

Code répété: Créez des fonctions d’aide pour calculer les valeurs min et max, puis appelez-les une fois pour calculer le x et le y .

Le code devrait afficher la définition de CSV . C'est une confusion d'avoir x dans une colonne et y dans une autre. Mieux vaut avoir un tableau de point (Créer sa propre structure en tenant un x et un y ), plutôt qu'un tableau de double paires.

Assurez-vous de #include