Bonjour
Petite fonction :
encadre(x,ordre):={
local k;
k:=0;
while(k*k<x){k:=k+ordre;};
if (k*k==x) return k;else return [k-ordre,k];
}
:;
pour encadre(50^2,0.1) j'obtiens [49.9,50]
pour encadre(50^2,0.01) j'obtiens [50,50.01]
j'aimerais comprendre pourquoi on n'obtient pas seulement 50 (une question de flottant ou pas ?)
et pourquoi dans le cas 2, 50 est la borne de gauche ?
test
Modérateur : xcasadmin
Il s'agit d'un effet de la représentation des flottants en base 2. Xcas utilise les flottants machines avec 52+1 bits de mantisse (pour les futures versions 0.9.x ce sera très probablement 45 bits) et 11 bits d'exposant. La représentation de 0.1 ou de 0.01 n'est pas exacte en base 2 (de même que 1/3 n'est pas représentable exactement en base 10) et les erreurs d'arrondi provoquent ce genre de petite surprise, comme par exemple le fait que 0.3-3*0.1 ne fait pas 0.0. Vous pouvez trouver quelques infos complémentaires par exemple sur mon cours de mat249. Je n'ai pas fait l'exercice qui consiste à comprendre pourquoi avec 0.01 et 0.1 l'arrondi fait changer l'encadrement, il faudrait écrire précisément en base 2 les nombres qui interviennent et les opérations avec arrondi. Il est possible que le résultat soit différent en travaillant avec des flottants longs (Digits:=16 ou plus).