41 votes

L'addition à virgule flottante est-elle commutative en C ++?

Pour les valeurs à virgule flottante, est-il garanti qu' a + b == b + a ?

Je crois que c'est garanti dans IEEE754, cependant la norme C++ ne précise pas que IEEE754 doit être utilisé. Le seul texte pertinent semble être de l' [expr.ajouter]#3:

Le résultat de l'binaire opérateur + est la somme des opérandes.

L'opération mathématique "somme" est commutatif. Toutefois, l'opération mathématique "somme" est aussi associative, alors que virgule flottante plus est certainement pas associatif. Donc, il me semble que nous ne pouvons pas conclure que la commutativité de la "somme" en mathématiques, c'est que cette citation indique la commutativité en C++.

20voto

Potatoswatter Points 70305

Non, le langage C++ en général ne ferait pas une telle exigence du matériel. Seulement l'associativité des opérateurs est défini.

Toutes sortes de choses folles ne se passera dans l'arithmétique à virgule flottante. Peut-être, sur certaines machines, l'ajout de zéro à un nombre de nombres dénormalisés produit zéro. Concevable qu'une machine pourrait éviter la mise à jour de la mémoire dans le cas de l'ajout d'une valeur zéro du registre des nombres dénormalisés dans la mémoire. Possible qu'un vraiment stupide compilateur aurait toujours mettre le LHS dans la mémoire et le membre de droite dans un registre.

Notez, cependant, qu'une machine avec des non-commutative plus serait nécessaire de définir précisément comment les expressions de la carte d'instructions, si vous allez avoir aucun contrôle sur l'opération qui vous obtenez. La gauche dans la première machine opérande ou le second?

Une telle ABI spécification, de mentionner la construction des expressions et des instructions dans le même souffle, serait tout à fait pathologique.

20voto

hvd Points 42125

Il n'est même pas nécessaire qu' a + b == a + b. L'un des sous-expressions peuvent contenir le résultat de l'addition avec plus de précision que l'autre, par exemple lors de l'utilisation de plusieurs ajouts requiert l'un de la sous-expressions à être temporairement conservées en mémoire, quand les autres sous-expression peut être conservé dans un registre (plus de précision).

Si a + b == a + b n'est pas garantie, a + b == b + a ne peut pas être garanti. Si a + b n'ont pas de retourner la même valeur à chaque fois, et les valeurs sont différentes, l'un d'eux nécessairement ne sera pas égale à une évaluation de l' b + a.

12voto

Jerry Coffin Points 237758

La norme C++ très précisément de ne pas garantir la norme IEEE 754. La bibliothèque dispose d'un certain soutien de la CEI 559 (qui est fondamentalement juste la CEI version de la norme IEEE 754), de sorte que vous pouvez vérifier si le sous-jacent de la mise en œuvre utilise la norme IEEE 754/IEC 559 si (et quand il le fait, vous pouvez compter sur ce qu'il garantit, bien sûr).

Pour la plupart, le C et le C++ normes de supposer que de telles opérations de base sera mis en œuvre, cependant le matériel sous-jacent œuvres. Pour quelque chose d'aussi commun que la norme IEEE 754, ils vous permettront de détecter s'il est présent, mais ne l'exige pas.

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