CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
C C
C T E S T L I N E A I R E , T R I V I A L E T V I O L E N T D E S E R R E U R S D ' A R R O N D I : C
C C
C C
C Author of '$xtf/flottant.42$f' : C
C C
C Jean-Francois COLONNA (LACTAMME, 20231210111238). C
C C
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
program main
double precision A,B,x0,x1,x2,x3,x4,x5,x6,x7
C Utilisation de la "double precision" representant les nombres flottants sur 64 bits. C
B=4095.1
A=B+1
C D'ou : C
C C
C A - B = 1 C
C C
x0 = 1
x1 = (A*x0)-B
x2 = (A*x1)-B
x3 = (A*x2)-B
x4 = (A*x3)-B
x5 = (A*x4)-B
x6 = (A*x5)-B
x7 = (A*x6)-B
C Evidemment : C
C C
C x1 = A*x0 - B C
C = A*1 - B C
C = A - B C
C = 1 C
C C
C et de meme : C
C C
C x2 = x3 = x4 = x5 = x6 = x7 = 1 C
C C
write(*,*) x0
write(*,*) x1
write(*,*) x2
write(*,*) x3
write(*,*) x4
write(*,*) x5
write(*,*) x6
write(*,*) x7
C A la date du 20231210133307, cela donne systematiquement les bons resultats (=1). Cela C
C vient du fait que les "compilateurs" Fortran sont des traducteurs en C. Or l'examen des C
C '$c's correspondants montre que la traduction de : C
C C
C B=4095.1 C
C C
C donne sur les MACHINEs '$LACT??' : C
C C
C b = 4095.1f; C
C C
C et le "f" est le signe d'une simple precision, or le test 'v $xtc/flottant.42$c float' C
C montre qu'en simple precision, cela fonctionne correctement. Il convient donc de trouver C
C un vrai compilateur Fortran... C
C A la date du 20231210135000, j'ai trouve la solution. Par exemple, sur '$LACT19', il C
C suffit d'utiliser les options : C
C C
C f95 -fdefault-real-8 flottant.42$f C
C C
C et sur 'CMAP28' -ex "porte-de-la-chapelle.polytechnique.fr"- : C
C C
C gfortran -fdefault-real-8 -fdefault-double-8 flottant.42$f C
C C
C pour obtenir : C
C C
C 1.0000000000000000 C
C 1.0000000000004547 C
C 1.0000000018630999 C
C 1.0000076314440776 C
C 1.0312591580864137 C
C 129.04063743775941 C
C 524468.25500880636 C
C 2148270324.2415719 C
C C
C C
C Du coup, ce programme possede deux proprietes exceptionnelles : C
C C
C 1-Il ne peut contenir ni d'erreurs(s) de logique, ni d'erreurs(s) de programmation ! C
C C
C 2-La valeur exacte des resultats {x1,x2,x3,x4,x5,x6,x7} est connue a l'avance (=1) ! C
C C
C C
C Le probleme vient de la partie decimale (0.1) de 4095.1 car, en effet, elle demande une C
C infinite de "decimales" en binaire : C
C C
C 0.0 0011 0011 0011 0011 0011 0011 0011 0011 0011 ... (ad infinitum) C
C C
C et ne peut donc etre representee exactement dans un ordinateur... C
end