/*************************************************************************************************************************************/ /* */ /* T E S T D U P R O B L E M E 'v $xiii/aleat.2$vv$FON 20080924174528' : */ /* */ /* */ /* Author of '$xtc/noeud.01$c' : */ /* */ /* Jean-Francois COLONNA (LACTAMME, 20080925101832). */ /* */ /*************************************************************************************************************************************/ #include <stdio.h> typedef union di { double d; struct i { int i1; int i2; } i; } di; #define edit(x,message) \ { \ printf("%s=%.18f --> {%08x,%08x}",message,d(x),i(x),j(x)); \ printf("\n"); \ } #define d(x) (x.d) #define i(x) (x.i.i2) #define j(x) (x.i.i1) #define IFLE(x,y) ((x) <= (y)) #define IFGT(x,y) ((x) > (y)) #define INCR(x,i) x = ((x)+(i)) #define SOUS(x,y) ((x)-(y)) #define DECR(x,i) x = SOUS(x,i) main() { int chercher_le_noeud=1; di coordonnee_d_un_point; di maille; di coordonnee_du_centre; di coordonnee_du_noeud; i(coordonnee_d_un_point)=0x3fd99999;j(coordonnee_d_un_point)=0x9999999a; i(maille)=0x3fb99999;j(maille)=0x9999999a; i(coordonnee_du_centre)=0x00000000;j(coordonnee_du_centre)=0x00000000; i(coordonnee_du_noeud)=i(coordonnee_du_centre);j(coordonnee_du_noeud)=j(coordonnee_du_centre); edit(coordonnee_d_un_point,"point"); edit(maille,"maille"); edit(coordonnee_du_centre,"centre"); edit(coordonnee_du_noeud,"noeud"); while (chercher_le_noeud == 1) { if (IFGT(d(coordonnee_du_noeud),d(coordonnee_d_un_point))) { DECR(d(coordonnee_du_noeud),d(maille)); edit(coordonnee_du_noeud,"DECR(noeud)"); } else { if (IFLE(d(coordonnee_du_noeud),SOUS(d(coordonnee_d_un_point),d(maille)))) { INCR(d(coordonnee_du_noeud),d(maille)); edit(coordonnee_du_noeud,"INCR(noeud)"); } else { chercher_le_noeud=0; } } } edit(coordonnee_du_noeud,"noeud"); /* Le 20080925131417, on note les resultats suivants : */ /* */ /* point=0.400000000000000022 --> {3fd99999,9999999a} */ /* maille=0.100000000000000006 --> {3fb99999,9999999a} */ /* centre=0.000000000000000000 --> {00000000,00000000} */ /* noeud=0.000000000000000000 --> {00000000,00000000} */ /* INCR(noeud)=0.100000000000000006 --> {3fb99999,9999999a} */ /* INCR(noeud)=0.200000000000000011 --> {3fc99999,9999999a} */ /* INCR(noeud)=0.300000000000000044 --> {3fd33333,33333334} */ /* noeud=0.300000000000000044 --> {3fd33333,33333334} */ /* */ /* sur {$CMAP28,$LACT15,$LACT16} avec les options {-O0,-O1,-O2,-O3}/[-ffloat-store] et sur */ /* '$LACT18' avec les options {-O0,-O1}/[-ffloat-store], et : */ /* */ /* point=0.400000000000000022 --> {3fd99999,9999999a} */ /* maille=0.100000000000000006 --> {3fb99999,9999999a} */ /* centre=0.000000000000000000 --> {00000000,00000000} */ /* noeud=0.000000000000000000 --> {00000000,00000000} */ /* INCR(noeud)=0.100000000000000006 --> {3fb99999,9999999a} */ /* INCR(noeud)=0.200000000000000011 --> {3fc99999,9999999a} */ /* INCR(noeud)=0.300000000000000044 --> {3fd33333,33333334} */ /* INCR(noeud)=0.400000000000000022 --> {3fd99999,9999999a} */ /* noeud=0.400000000000000022 --> {3fd99999,9999999a} */ /* */ /* sur '$LACT18' avec les options {-O2,-O3}/[-ffloat-store]. Ce sont ces valeurs qui sont */ /* les bonnes puisque 'point' et 'noeud' sont absolument identiques a la fin du processus. */ /* */ /* Le probleme semble donc venir de l'optimisation... */ }