2010-02-28 12 views
2

Je souhaite arrondir un nombre à virgule flottante pour définir la précision et renvoyer le résultat d'une fonction. Par exemple, j'ai actuellement la fonction suivante:C++ arrondi nombres flottants pour définir la précision

inline bool R3Point:: 
operator==(const R3Point& point) const 
{ 
    // Return whether point is equal 
    return ((v[0] == point.v[0]) && (v[1] == point.v[1]) && (v[2] == point.v[2])); 
} 

Ce que je veux faire est au lieu de faire une comparaison v[i] == point.v[i] directe, je voudrais comparer que des chiffres à une certaine précision de jeu, de sorte que si v[i] = 0.33349999999999996 et point.v[i] = 0.33350000000000002, ma comparaison égale se traduira par VRAI.

Je suis conscient qu'il existe une fonction C++ smanip setprecision (int n); et j'ai vu beaucoup utilisé lors de l'affichage de sortie à l'écran en utilisant cout. Cependant, je ne suis pas sûr si cela peut être utilisé dans la fonction comme je l'ai décrit.

Merci.

Répondre

5

En général, == ne doit pas être utilisé pour comparer les doubles, vous devriez faire quelque chose comme:

if(v[0] - point.v[0] < 1e-9) { } 

Vous pouvez utiliser abs ou fabs si vous n'êtes pas sûr du signe et changer le 1E-9 précision en conséquence .

+0

qu'est-ce que tu veux dire par changer la précision 1e-9 en conséquence? Dans mon cas, je ne suis pas sûr du signe donc j'utiliserais quelque chose if (fabs (v [0] -point.v [0]) <1e-9). – Myx

+0

Je voulais dire, vous devez changer 1e-9 en fonction du nombre de chiffres dont vous avez besoin pour être précis. –

3

La comparaison de 2 nombres à virgule flottante (disons a et b), est mieux fait en utilisant ce qui suit: abs (a-b) < précision. Où abs (x) est la fonction de valeur absolue et la précision est un petit nombre positif. Souvent, vous voulez définir la précision en fonction de la valeur absolue des nombres comparés eux-mêmes.

+2

Veillez à écrire std :: abs au lieu de simplement abs ou vous pourriez accidentellement obtenir la fonction C qui ne fait que des entiers. Bon débogage alors ... – Tronic