ecriture scientifique
Modérateur : xcasadmin
ecriture scientifique
Bonjour,
J'aimerais pouvoir vérifer l'erreur commise par une méthode d'approximation d'un nombre avec un grand nombre de décimales. Par exemple, Pi avec 100 ou 500 chiffres.
Bêtement, je voulais calculer la différence entre mon approximation et la valeur machine. Le problème est que la réponse est illisible puisque le delta s'affiche 100 ou 500 chiffres. Si je fais evalf(delta,2) j'obtiens bien évidemment 0,0.
J'ai cherché dans l'aide, mais je n'ai pas trouvé comment écrire un nombre en écriture scientifique avec peu de chiffres significatifs.
Est-ce possible ?
Merci
J'aimerais pouvoir vérifer l'erreur commise par une méthode d'approximation d'un nombre avec un grand nombre de décimales. Par exemple, Pi avec 100 ou 500 chiffres.
Bêtement, je voulais calculer la différence entre mon approximation et la valeur machine. Le problème est que la réponse est illisible puisque le delta s'affiche 100 ou 500 chiffres. Si je fais evalf(delta,2) j'obtiens bien évidemment 0,0.
J'ai cherché dans l'aide, mais je n'ai pas trouvé comment écrire un nombre en écriture scientifique avec peu de chiffres significatifs.
Est-ce possible ?
Merci
Re: ecriture scientifique
Vous pouvez calculer le log10 de la valeur absolue de la difference et en prendre la partie entiere (ou l'arrondir a 1 ou 2 decimales).
-
- Messages : 1137
- Inscription : dim. mai 20, 2007 7:09 am
- Localisation : Paris
- Contact :
Re: ecriture scientifique
Bonjour,
je pense qu'il y a une difference le evalf(delta,k) avec k<14 car xcas travaille en fait avec plus que k decimales, c'est juste a l'affichage que c'est tronque.
Dans votre exemple: evalf(delta,14) ne donnera pas 0 et sera bien lisible.
Ex:
a:=approx(pi,1000)
b:=approx(pi,990)
c:=a-b
approx(c,14)
-0.944436335053647e-990
je pense qu'il y a une difference le evalf(delta,k) avec k<14 car xcas travaille en fait avec plus que k decimales, c'est juste a l'affichage que c'est tronque.
Dans votre exemple: evalf(delta,14) ne donnera pas 0 et sera bien lisible.
Ex:
a:=approx(pi,1000)
b:=approx(pi,990)
c:=a-b
approx(c,14)
-0.944436335053647e-990
Re: ecriture scientifique
C'est une solution, certes.
Mais je défends vivement l'idée sous-jacente dans le premier message de cette discussion : avoir une commande d'affichage formaté, ne serait-ce qu'une sorte de printf.
Jongler avec la précision des objets peut être assez délicat. Comparez par exemple
evalf(2*pi+0.1,55)
et
evalf(2*pi+evalf(1/10,55),55)
Seulement le deuxième est satisfaisant en termes de précision (le premier étant réduit à la précision de float de la machine imposée par 0.1). C'est pour cela que j'ai tendance à recommander l'usage de Digits. Mon exemple devient alors très simple
Digits:=55
evalf(2*pi+0.1)
Pensez maintenant aux exemples un peu plus réalistes (des approximations à une très grande précision pour déterminer numériquement des intégrales compliquées, tester des conjectures etc..)
Je considère Digits comme un avantage remarquable de Xcas (et d'ailleurs Maple) par rapport à certains autres logiciels.
Le problème c'est qu'alors en Xcas il est difficile d'avoir une affichage simple et lisible. Une commande de formatage, même basique, serait donc vraiment utile.
PS. Bien évidemment, on peut mener les calculs avec Digits:=5000 puis afficher le résultat final avec, par exemple, evalf(x,14). Mais ceci donne facilement zéro si x est d'ordre 10^(-60). Et a priori on ne connait pas l'ordre de magnitude.
Mais je défends vivement l'idée sous-jacente dans le premier message de cette discussion : avoir une commande d'affichage formaté, ne serait-ce qu'une sorte de printf.
Jongler avec la précision des objets peut être assez délicat. Comparez par exemple
evalf(2*pi+0.1,55)
et
evalf(2*pi+evalf(1/10,55),55)
Seulement le deuxième est satisfaisant en termes de précision (le premier étant réduit à la précision de float de la machine imposée par 0.1). C'est pour cela que j'ai tendance à recommander l'usage de Digits. Mon exemple devient alors très simple
Digits:=55
evalf(2*pi+0.1)
Pensez maintenant aux exemples un peu plus réalistes (des approximations à une très grande précision pour déterminer numériquement des intégrales compliquées, tester des conjectures etc..)
Je considère Digits comme un avantage remarquable de Xcas (et d'ailleurs Maple) par rapport à certains autres logiciels.
Le problème c'est qu'alors en Xcas il est difficile d'avoir une affichage simple et lisible. Une commande de formatage, même basique, serait donc vraiment utile.
PS. Bien évidemment, on peut mener les calculs avec Digits:=5000 puis afficher le résultat final avec, par exemple, evalf(x,14). Mais ceci donne facilement zéro si x est d'ordre 10^(-60). Et a priori on ne connait pas l'ordre de magnitude.
-
- Messages : 1137
- Inscription : dim. mai 20, 2007 7:09 am
- Localisation : Paris
- Contact :
Re: ecriture scientifique
C'est bizarre, pour moi avec 14 chiffres ca ne fait pas 0 facilement, je peux aussi travailler avec un gros Digits et n'afficher qu'avec approx(x,14) (mais pas moins)
33>> Digits:=100
[0,0,0,1,0,[1e-12,1e-15],100,[2,50,0,25],0,1,0]
// Time 0
34>> x:=10.0^(-555):;
"Done"
// Time 0
35>> approx(x,14)
0.100000000000000e-554
33>> Digits:=100
[0,0,0,1,0,[1e-12,1e-15],100,[2,50,0,25],0,1,0]
// Time 0
34>> x:=10.0^(-555):;
"Done"
// Time 0
35>> approx(x,14)
0.100000000000000e-554
Re: ecriture scientifique
Normalement, dès qu'on dépasse 14 chiffres, ce sont des flottants multi-précisions qui sont utilisés, et donc il ne devrait pas y avoir de problèmes d'overflow de l'exposant vers le bas (alors que pour des flottants hardware, ça va se produire dès 2^(-2^10), plus précisément en-deça on aura des flottants dénormalisés puis dès que les bits de mantisse sont épuisés, 0.
Donc evalf(.,14) devrait marcher (et il me semble difficile d'avoir une commande de formattage plus simple), je vous conseille toutefois d'utiliser evalf(.,15) car avec le passage de 45 à 48 bits de mantisse dans la version 1.1 je risque de relever à 15 le nombre de chiffres à partir duquel les flottants multiprécision sont utilisés.
Donc evalf(.,14) devrait marcher (et il me semble difficile d'avoir une commande de formattage plus simple), je vous conseille toutefois d'utiliser evalf(.,15) car avec le passage de 45 à 48 bits de mantisse dans la version 1.1 je risque de relever à 15 le nombre de chiffres à partir duquel les flottants multiprécision sont utilisés.
Re: ecriture scientifique
Merci bien pour toutes ces précisions
Re: ecriture scientifique
Oups je suis allé trop vite, désolé ! En effet, on peut travailler comme ça.frederic han a écrit :C'est bizarre, pour moi avec 14 chiffres ca ne fait pas 0 facilement, je peux aussi travailler avec un gros Digits et n'afficher qu'avec approx(x,14) (mais pas moins)
En fait je pensait à un exemple...
Digits:=500:;
x:= pi;
y := log(262537412640768744) / sqrt(163));
evalf(x-y,14)
Cela donne à peu prés zéro, mais j'ai complètement oublié que x et y n'étaient pas float.
Si x:=evalf(pi), alors evalf(x-y,14) renvoie le résultat satisfaisant (et non pas zéro).
Je dois donc retirer mon poste précédent, evalf fait l'affaire...
![Rolling Eyes :roll:](./images/smilies/icon_rolleyes.gif)