Comparer les doubles
Je suis en train d'écrire un programme qui se compose d'une boucle while qui lit deux doubles et les imprime. Le programme permet également d'imprimer ce que le plus grand nombre et quel est le plus petit nombre est.
c'est le code que j'ai jusqu'ici.
int main()
{
//VARIABLE DECLARATIONS
double a;
double b;
while (a,b != '|') //WHILE A & B DO NOT EQUAL '|'
{
cin >>a >>b;
cout << a << b << "\n" ;
if (a<b) //IF A<B: SMALLER VALUE IS A
cout << "The smaller value is:" << a << endl
<< "The larger value is:" << b << endl ;
else if (b<a) //ELSE IF B<A
cout << "The smaller value is:" << b << endl
<< "The larger value is:" << a << endl ;
else if (b==a)
cout << "The two numbers you entered are equal." << "\n" ;
}
}
La prochaine étape est d'avoir le programme écrit "les chiffres sont presque égaux" si les deux nombres diffèrent de moins de 1.0/10000000. Comment puis-je faire?
source d'informationauteur Capkutay
Vous devez vous connecter pour publier un commentaire.
Ici est de savoir comment je test d'égalité, sans un "facteur":
Explication
Le premier test est une simple comparaison. Bien sûr, nous savons tous que la comparaison des valeurs de double précision peut être jugée inégale, même quand ils sont logiquement équivalentes.
Un double précision en virgule flottante valeur peut tenir le plus important de quinze chiffres d'un nombre (en fait ≈15.955 chiffres). Par conséquent, nous voulons appeler deux valeurs égales si (environ) de leurs quinze premiers chiffres correspondent. À cette phrase d'une autre manière, nous voulons appeler égales si elles sont à une échelle epsilon les uns des autres. C'est exactement ce que le deuxième test calcule.
Vous pouvez choisir d'ajouter plus de marge de manœuvre que d'une seule échelle epsilon, en raison des plus importants à virgule flottante erreurs qui se glissent dans la suite de itératif de calcul. Pour ce faire, ajoutez un facteur d'erreur à la droite de la deuxième test de comparaison:
Je ne peux pas vous donner une valeur fixe pour le
error_factor
car il dépendra de la quantité d'erreur qui se glisse dans vos calculs. Cependant, avec quelques essais, vous devriez être en mesure de trouver une valeur raisonnable qui convient à votre application. Ne gardez à l'esprit que l'ajout d'un (arbitraire) le facteur d'erreur basé sur la spéculation seul qui va vous mettre le droit de retour dans le fudge factor territoire.Résumé
Vous pouvez envelopper le test suivant dans un(n inline) fonction:
std::abs(a - b) < 0.000001
Bien sûr, remplacer la constante avec ce que vous considérez le "presque".
Il suffit de tester si la différence est de moins de ce montant 🙂
Vous pouvez ajouter une valeur d'erreur (votre 1.0 /10000000.0 ), mais il est généralement préférable d'utiliser un multiplicateur, donc la comparaison est pour le même niveau de précision.
Si vous voulez le tester à l'échelle avec a et b, vous pouvez essayer de tester l'abs(a/b-1) < e, où e est votre favori petit nombre, comme de 0,001. Mais cette condition est en fait asymétrique en a et b, donc il peut travailler à dire que a est proche de b, mais b n'est pas proche de un. Ce serait mauvais. Il est mieux de le faire en abs(log(a/b)) < e, où e, de nouveau, est votre favori très petit nombre. Mais les logarithmes présent supplément de calcul, pour ne pas mentionner terrifiant des étudiants de premier cycle partout.
Je propose l'article suivant: nouveau lien
(obsolète lien->La comparaison des nombres à virgule flottante)
Je suis aussi la lecture du livre, puisque nous n'avons pas de std::abs, j'ai fait quelque chose comme ça: