Double précision en C - l'impression de 50 chiffres significatifs, les rendements des valeurs inexactes
Je suis en train de faire un programme d'intégration avec des sommes de Riemann pour mon cours de Calcul. J'ai décidé d'utiliser le C pour le calcul de mes intégrales, et j'ai remarqué une énorme erreur dans mon programme qui dérive de ce problème.
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main(int argc, char** argv) {
double x = 2.0/20.0;
printf("%1.50f \n", x);
return (EXIT_SUCCESS);
}
Le programme me donne : 0.10000000000000000555111512312578270211815834045410. Ma question: Pourquoi est-ce arrivé? Et comment puis-je résoudre ce problème? Ou au moins arrondie à ~15 décimales?
Merci pour l'aide.
Eh bien,
Aussi il est recommandé de lire Ce que Tout informaticien Devez Savoir à Propos de l'Arithmétique à virgule Flottante et Chapitre 4 - l'Arithmétique du Volume 2 de Donald Knuth L'Art de la Programmation Informatique.
"%1.50f"
tours à 50 décimales, ce qui serait pourquoi vous voyez ces innacurate résultats de la première place...Aussi il est recommandé de lire Ce que Tout informaticien Devez Savoir à Propos de l'Arithmétique à virgule Flottante et Chapitre 4 - l'Arithmétique du Volume 2 de Donald Knuth L'Art de la Programmation Informatique.
OriginalL'auteur user992711 | 2011-10-19
Vous devez vous connecter pour publier un commentaire.
Les bases de la virgule flottante:
http://en.wikipedia.org/wiki/Floating_point
La réponse dans votre cas
0.10
n'est pas exactement représentable en binaire à virgule flottante. Par conséquent, c'est seulement précis à propos de 16 chiffres. Pourtant, vous essayez d'imprimer à 50 décimales.Changer le 50 en
"%1.50f\n"
dans un sain d'esprit tel que"%.16f\n"
. Qui fonctionne pour le numéro que vous avez; vous pourriez être mieux avec%e
ou%g
format pour les nombres avec beaucoup de plus grande ou de plus petite ampleur.Vous ne pouvez pas arrondir le nombre lui-même, car il est stocké en binaire. Mais vous pouvez autour d'elle quand vous l'imprimer avec
%1.16f
. Notez que 16 chiffres est déjà un peu plus que ce quedouble
peut tenir pour ne pas mentionner d'autres erreurs d'arrondi. Afin d'impression de 16 chiffres ont encore du "bruit" dans les derniers chiffres.OriginalL'auteur Mysticial
Si vous avez besoin d'obtenir des résultats plus précis que ce que
double
peut offrir, alors vous voudrez peut-être vérifier certains des précision arbitraire des bibliothèques qui sont disponibles.OriginalL'auteur Miguel