Ma réponse originale (d'il y a 4 ans) critique la décision d'un point de vue moderne sans comprendre le contexte dans lequel la décision a été prise. En tant que telle, elle ne répond pas à la question.
La réponse correcte est donnée aquí :
NaN
!= NaN
est née de deux considérations pragmatiques :
[...] Il n'y avait pas isnan( )
à l'époque où NaN a été formalisé dans l'arithmétique 8087 ; il était nécessaire de fournir aux programmeurs un moyen pratique et efficace de détecter les valeurs NaN sans dépendre de langages de programmation fournissant quelque chose comme isnan( )
ce qui pourrait prendre plusieurs années
Cette approche présentait un inconvénient : elle rendait NaN moins utile dans de nombreuses situations sans rapport avec le calcul numérique. Par exemple, bien plus tard, lorsque les gens ont voulu utiliser NaN
pour représenter les valeurs manquantes et les mettre dans des conteneurs basés sur le hachage, ils n'y sont pas parvenus.
Si la commission avait prévu des cas d'utilisation futurs et les avait jugés suffisamment importants, elle aurait pu opter pour la formule plus verbeuse suivante !(x<x & x>x)
au lieu de x!=x
comme un test pour NaN
. Cependant, leur objectif était plus pragmatique et étroit : fournir la meilleure solution pour un calcul numérique, et en tant que tel, ils ne voyaient aucun problème dans leur approche.
\===
Réponse originale :
Je suis désolé, bien que j'apprécie la réflexion qui a été faite dans la réponse la plus votée, je ne suis pas d'accord avec elle. NaN ne signifie pas "indéfini" - cf. http://www.cs.berkeley.edu/~wkahan/ieee754status/IEEE754.PDF page 7 (recherchez le mot "undefined"). Comme le confirme ce document, NaN est un concept bien défini.
De plus, l'approche de l'IEEE consistait à suivre les règles mathématiques régulières autant que possible, et lorsqu'elles ne le pouvaient pas, à suivre la règle de la "moindre surprise" - cf. https://stackoverflow.com/a/1573715/336527 . Tout objet mathématique est égal à lui-même, donc les règles mathématiques impliqueraient que NaN == NaN devrait être vrai. Je ne vois aucune raison valable et puissante de s'écarter d'un principe mathématique aussi important (sans parler des règles moins importantes de la trichotomie de comparaison, etc.)
En conséquence, ma conclusion est la suivante.
Les membres du comité IEEE n'ont pas réfléchi très clairement et ont fait une erreur. Comme très peu de gens ont compris l'approche du comité IEEE, ou se sont souciés de ce que la norme dit exactement à propos de NaN (à savoir : le traitement de NaN par la plupart des compilateurs viole de toute façon la norme IEEE), personne n'a tiré la sonnette d'alarme. Par conséquent, cette erreur est maintenant intégrée dans la norme. Il est peu probable qu'elle soit corrigée, car une telle correction casserait beaucoup de code existant.
Edit : Voici un poste d'une discussion très instructive. Remarque : pour avoir une vision impartiale, vous devez lire l'intégralité du fil de discussion, car Guido a un point de vue différent de celui de certains autres développeurs principaux. Cependant, Guido n'est pas personnellement intéressé par ce sujet, et suit largement les recommandations de Tim Peters. Si quelqu'un a les arguments de Tim Peters en faveur de NaN != NaN
veuillez les ajouter dans les commentaires ; ils ont de bonnes chances de me faire changer d'avis.
12 votes
Les normes IEEE ont été conçues par des ingénieurs, et non par des programmeurs, des vendeurs d'ordinateurs ou des auteurs de bibliothèques mathématiques, pour lesquels la règle NaN est un désastre.