Page 1 sur 1

DIGITS et evalf

Publié : lun. nov. 03, 2008 9:04 pm
par Guillaume
Il semble impossible de fixer DIGITS selon la valeur d'un paramètre à l'inétrieur d'une procédure.

Par exemple,

precision(n):={
DIGITS:=n+1;
evalf(sqrt(2));
}
ne fonctionne pas.

Ne pourrait-on avoir un "evalf(sqrt(2),nb de digits)" ?

Publié : mar. nov. 04, 2008 7:26 am
par parisse
Oui, ca marche déjà, par exemple
evalf(sqrt(2),50)

Publié : mar. nov. 04, 2008 9:49 am
par Guillaume
Bonne nouvelle.
Un nouveau problème maintenant avec un test qui ne passe pas.
Voici la mise en route :

Code : Tout sélectionner

f:=x->x^2-2:;p:=20:;u0:=2:;
d:=p+size(string(floor(u0)));
k:=0;
un:=evalf(u0-f(u0)/fp(u0),d); 
Mais ce test ne fonctionne pas :

Code : Tout sélectionner

evalf(abs(-f(un)/fp(un)),d)>=evalf(10^(-p),d);
alors que celui-ci, si :

Code : Tout sélectionner

0.5989427408919430005625e-21>=0.9999999999999999999997e-20

Publié : mar. nov. 04, 2008 10:00 am
par Guillaume
Il me semble que ça dépend du réglage d'epsilon.

Publié : mar. nov. 04, 2008 12:07 pm
par parisse
Oui, car le test de 2 nombres voisins de moins de epsilon est considere comme non fiable.
Du coup je viens de corriger un bug dans epsilon qui ne marchait qu'avec un argument de type double precision et pas avec un reel multiprecision.

Publié : dim. nov. 16, 2008 8:10 pm
par slejoly
Pour la précision j'en remets une couche : pour evalf(sqrt(2),50) c'est OK, mais si je tape evalf(sqrt(2),5) cela donne 1.41421356237 donc toujours avec DIGITS=12 comme réglé dans la configuration du CAS, la commande ne peut-elle pas prendre le dessus sur la configuration générale ?

Stéphane Lejoly

Publié : lun. nov. 17, 2008 9:06 am
par parisse
On ne peut pas faire descendre la precision des reels en-dessous de 14 chiffres significatifs. La seule chose qu'on peut modifier c'est l'affichage. Donc evalf(...,5) calcule avec 14 chiffres, et ca n'a aucune influence sur le resultat affiche qui depend de Digits. Pour arrondir a 5 chiffres significatifs, il faut actuellement utiliser round. Par exemple round(pi,5).
Je peux peut-etre modifier evalf pour appeler round lorsque le nombre de chiffres est < 14.