Présentation du problème

Le format IEEE-754 NaN (Not a Number) est étrange et souvent négligé dans la conception des langages de programmation. Cela conduit à des comportements inattendus lorsqu'il est utilisé dans certaines situations.

Étude de cas : Python

En Python, la comparaison de listes pour l'égalité est optimisée en comparant d'abord les éléments par identité, puis par égalité si les identités sont différentes. Cependant, cela ne fonctionne pas pour NaN, car nan == nan retourne False, contrairement à [nan] == [nan] qui retourne True.

Ceci est dû au fait que les objets Python sont censés être réflexifs, c'est-à-dire qu'un objet est toujours égal à lui-même. Cependant, NaN ne suit pas cette règle, ce qui peut conduire à des comportements étranges.

Étude de cas : Lua

Dans Lua, les boucles numériques utilisent une syntaxe spécifique pour itérer sur une plage de valeurs. Cependant, lorsque NaN est utilisé dans ces boucles, le comportement devient très contre-intuitif.

Par exemple, la boucle for i = 0/0, 10 do n'exécute qu'une seule fois, car la condition de terminaison de la boucle est basée sur une comparaison qui échoue lorsque NaN est utilisé. De même, la boucle for i = 1, 10, 0/0 do n'exécute jamais, car la valeur de pas est toujours traitée comme négative.

Implications et limites

Ces exemples montrent que NaN peut causer des problèmes inattendus dans les langages de programmation. La solution la plus simple est de vérifier et d'interdire l'utilisation de NaN dans les situations où il peut causer des problèmes. Cela peut être fait en ajoutant des vérifications spécifiques pour NaN, comme Lua le fait déjà pour la valeur 0 utilisée comme pas.

for i = 0/0, 10 do print(i) end

Il est important de prendre en compte les comportements étranges de NaN lors de la conception de langages de programmation pour éviter les erreurs inattendues.