/* limite des flottants */
int main(void) {
int i=0 ; float x=1.0;
/* pour le plus grand positif */
while(i<45) {
x=x*10.0 ; i=i+1 ;
printf("10^%d en float = %e \n",i,x) ; }
x=x/pow(10.0,10) ;
Printf("en divisant par 10^10 : = %e \n",x) ; i=0 ; x=1.0;
/* pour le plus petit positif */
while(i<47) {
x=x/10.0 ; i=i+1 ;
printf("10^-%d en float = %e \n",i,x) ; }
return 0;
10^37 en float = 1.000000e+37 10^38 en float = 1.000000e+38 10^39 en float = inf
10^40 en float = inf
…
10^45 en float = inf
en divisant par 10^10= inf
…
10^-39 en float = 1.000000e-39 10^-40 en float = 9.999946e-41 10^-41 en float = 9.999666e-42 10^-42 en float = 1.000527e-42 10^-43 en float = 9.949219e-44 10^-44 en float = 9.809089e-45 10^-45 en float = 1.401298e-45 10^-46 en float = 0.000000e+00 10^-47 en float = 0.000000e+00
Limite repoussée
Plus de notion d'overflow ni d'underflow : attention
Quand la mantisse est entièrement à 1 et l’exposant à 255 le plus grand flottant est :
(2-1+2-2+….+2-24)2(255-127)
= (1-2-24)*2128 ≈ 3,4 1038
Sans dénormaliser, le plus petit nombre est : (2-1)2(0-127) =2-128 ≈ 2,9 10-39
Quand on dénormalise le nombre, le plus petit nombre est :
2-24 *2(0-127)= 2-151 ≈ 3,5 10-46
…
10^36 en float = 1.000000e+36 10^37 en float = 1.000000e+37 10^38 en float = 1.000000e+38 10^39 en float = inf
10^40 en float = inf
…
10^45 en float = inf
en divisant par 10^10= inf
…
10^-39 en float = 1.000000e-39 10^-40 en float = 9.999946e-41 10^-41 en float = 9.999666e-42 10^-42 en float = 1.000527e-42 10^-43 en float = 9.949219e-44 10^-44 en float = 9.809089e-45 10^-45 en float = 1.401298e-45 10^-46 en float = 0.000000e+00 10^-47 en float = 0.000000e+00
int main(void) {
float x = 1.0 ; float eps = 1.0 ; int i ;
while(x != x+eps) {
eps = eps/2 ; }
eps=1.0 ; return 1 ; }
printf(« %d\n », max+1) ;
Réalisé sur des registres de 80 bits Sans passer par des variables
Même résultat en float et double … La mantisse est sur 64 bits
Code « mal généré » sur les machines de l'ESIL
Conclusion :
Il faut toujours être prudent !!
int main(void) {
float x = 1.0 ; float eps = 1.0 ; int i ;
while(x != x+eps) {
eps = eps/2 ; }
return 1 ; }
2-24 = 5,9605 10-8
Or la plus petite perturbation est de l'ordre de 2-24 Et 2-24 ne modifie pas 1
?????????
1.0 = 2-1 *21
Le bit de poids le plus faible est en 2-24,
…
multiplié par l'exposant, donc en 2-23 ! 2-64 = 5,42101 10-20
Dans le registre, la plus petite Perturbation de 1 est de l'ordre de 2-63
int main(void) {
float x = 1.0 ; float x1, eps ;
printf("donner une perturbation eps : ");
scanf("%e", &eps) ; x1=x+eps ;
if (x==x1)
printf("eps ne modifie pas 1 \n") ; else
printf("eps modifie 1 \n") ; return 1 ;
} titaniummd3:test en C mdaniel$ ./delta-quart donner une perturbation eps : 5.96e-8
eps ne modifie pas 1
titaniummd3:test en C mdaniel$ ./delta-quart donner une perturbation eps : 5.97e-8
eps modifie 1