Quand une variable n’est pas égale à elle-même

Est-il possible de faire en sorte que « pas égal » soit imprimé dans la console sans modifier la structure suivante ?

if(x==x){
  System.out.println("égal");
}
else
{
  System.out.println("pas égal");
}

La réponse est oui et tient aux particularités de la majorité des langages de programmation. Le code suivant imprimera « pas égal » dans la console.

double x = 0.0/0.0;
 
if(x==x){
  System.out.println("égal");
}
else  
{  
  System.out.println("pas égal");
}

La raison tient au fait c’est que le type double a été conçu de manière à suivre le standard IEEE 754 pour les calculs en virgule flottante. Contrairement au int où un java.lang.ArithmeticException a sa raison d’être, le double permet la division par zéro et retourne une valeur qui s’imprimera comme « NaN » (signifiant Not a Number/pas un nombre).

Il reste à expliquer pourquoi le else est déclenché. Cela tient à la particularité du NaN. En effet, celui-ci n’est jamais égal à lui-même. Cela peut sembler curieux à priori mais réflêchissons à l’expréssion « Not a Number ». Si quelque chose n’est pas un nombre (négation d’ensemble) cela ne veut pas nécessairement dire que deux NaN représentent la même chose. Dès lors cette inégalité en « dur » se justifie.

P.S: A titre d’anecdote il y a une autre manière de enclencher le « pas égal » en exploitant les particularités de la compilation Java. La signification des codes Unicode (\u…) a été retranscrite en commentaire dans les lignes suivantes.

int x = 10;
 
if ( x == x ) {
  // \u000a \u007d else \u007b
  // Line-feed } else {
  System.out.println("égal");  
}
   
  // \u000a if ( false ) \u007b \u007d
  // Line-feed if(false){ }
else {
  System.out.println("pas égal");
}

15 réflexions au sujet de « Quand une variable n’est pas égale à elle-même »

  1. Ping : Recap java, semaine 30, année 2012 | Blog de la rubrique java

  2. Les particularités du NaN méritent d’être souligné. Il y a un semblant d’inconsistance avec Integer jusqu’à ce qu’on comprenne qu’il s’agit d’une implémentation d’un standard international.

    Pour ce qui est des séquences d’échappement, il y a probablement aucune fin pratique. Mais c’est le genre de détail qui pourrait donner l’impression qu’on a bien exploré l’environnement de programmation.

  3. Autant je connaissais la subtilité du NaN qui n’est pas égal à lui-même, autant je ne savais pas que les séquences d’échappement Unicode pouvaient être utilisées en dehors des chaines de caractères.

    Je pense que ça ne me servira jamais mais merci quand même pour l’info.

Les commentaires sont fermés.