35 votes

Quand utiliser les fonctions de comparaison de flottants en C ?

Dans la dernière norme C++, j'ai remarqué les macros suivantes :

bool isgreater(float x, float y);
bool isgreaterequal(float x, float y);
bool isless(float x, float y);
bool islessequal(float x, float y);
bool islessgreater(float x, float y);
bool isunordered(float x, float y);

Ces macros sont issues du langage C (7.12.14 et 7.12.14).

Alors, pourquoi utiliser ces macros plutôt que des opérateurs ? Ces macros font-elles quelque chose de spécial (comme vérifier la présence de inf ), ou sont-ils identiques à l'opérateur correspondant ?

Exemple C++ :

#include <iostream>
#include <cmath>

int main()
{
  float x=0.2;
  float y=0.5;
  std::cout << x << " < " << y << " : " << std::boolalpha << std::islessequal( x, y ) << std::endl;
  std::cout << x << " < " << y << " : " << std::boolalpha << ( x <= y ) << std::endl;
}

38voto

phresnel Points 20082

À la différence des opérateurs relationnels, ces macros ne sont vraiment seulement renvoie une valeur booléenne et ne jamais soulever d'exception de virgule flottante.

En bref: Vous n'avez à traiter avec des true/false et rien d'autre.


références:

Le Groupe de descriptions (pas le C ou le C++ standard, mais très pertinent dans le monde Unix/Linux et presque toujours semblables aux normes):

C++ standard:

La Bibliothèque C [c.maths]:

La classification/fonctions de comparaison comportent le même que le C macros avec les noms correspondants définis dans 7.12.3, la Classification des macros, et 7.12.14, la Comparaison des macros en C Standard. Chaque fonction est surchargé pour les trois les types à virgule flottante, comme suit [...]

C standard:

7.12.14 Comparaison des macros

[...] Pour tout a ordonné paire de valeurs numériques exactement l'un des les relations de moins, plus, et de l'égalité - c'est vrai. Relationnel opérateurs peuvent augmenter l' ‘non valide" exception de virgule flottante lorsque les valeurs d'argument sont NaNs. Pour un NaN et un valeur numérique, ou pour les deux NaNs, juste le non ordonnée relation est vraie. La suite de subdivisions de fournir des macros qui sont tranquilles (non exception de virgule flottante de sensibilisation) les versions des opérateurs relationnels, et en comparaison d'autres macros permettant de faciliter l'écriture de code efficace que les comptes pour les NaNs sans avoir à subir les ‘invalides" exception de virgule flottante. Dans le synopsis de cette subdivision, réel flottante indique que l'argument doit être un l'expression de la véritable type flottant.

13voto

ecatmur Points 64173

isgreater et al. ont été incorporés dans le C++11 à partir du C99. Ils sont définis pour ne pas lever l'exception de la virgule flottante invalide lorsque x et/ou y signalent NaN valeurs.

La raison invoquée est la suivante :

Cette macro est une version silencieuse (qui ne soulève pas d'exception en virgule flottante) d'un opérateur relationnel. Elle facilite l'écriture d'un code efficace qui prend en compte les NaN sans souffrir de l'exception de la virgule flottante invalide.

La valeur numérique de la macro sur NaN est toujours la même ; NaN sont fausses par rapport à toutes les autres valeurs, y compris NaN sous tous les opérateurs relationnels et les nouvelles macros.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X