J'ai juste une question à laquelle je ne peux pas répondre.
Supposons que vous ayez cette définition de boucle en Java:
while (i == i) ;
Quel est le type i
et la valeur de i
si la boucle n'est pas une boucle infinie et que le programme n'utilise qu'un seul thread ?
Réponses:
L'API pour Double.equals () précise la réponse: "Double.NaN == Double.NaN a la valeur false". Ceci est développé dans la spécification du langage Java sous " Types, formats et valeurs à virgule flottante ":
la source
x == x
devrait toujours être vrai. Pourquoi quelque chose ne devrait-il pas s'égaler?null=null
est nul.NULL IS NULL
est 1.La valeur de
i
est alors Invalid. "Pas un nombre".Après quelques recherches sur Google, j'ai découvert que vous POUVEZ avoir NaN (Not a Number) en Java! Ainsi, un nombre à virgule flottante est le type de données et la valeur est NaN. Voir ici
la source
NaN n'est égal à rien, y compris lui-même.
la source
la source
Je ne suis pas sûr, mais je crois que (i == i) n'est pas une opération atomique dans un processus multithread, donc si la valeur de i sera modifiée par un autre thread entre les poussées de sa valeur à empiler sur le thread exécutant la boucle, alors cette condition peut être faux.
la source
Depuis que d'autres ont dit que c'était NaN, je me suis intéressé à l'implémentation officielle (JDK 6) de
Double.isNaN
, et voici:la source
Considérez Nan comme l'équivalent d'une exception mais utilise une valeur magique dans un calcul. Parce qu'un calcul a échoué - par exemple, racine carrée d'un négatif, diviser par zéro, etc. - cela n'a aucun sens de les comparer à autre chose. Après tout, si diviser par zéro est un nan, est-ce équivalent à la racine carrée de -2 ou à la racine carrée de -3?
Nan permet un calcul qui comprend une étape qui renvoie une réponse invalide à terminer sans introduire d'exceptions supplémentaires. Pour vérifier que la réponse est la valeur, testez simplement la non-nandness (c'est un mot sinon je le sache) via Float.isNan () o équivalent.
la source
J'ajouterais
aussi bien que
Une astuce courante dans ce genre de questions consiste à supposer que i est un entier. D'autres hypothèses courantes pourraient être que s est une chaîne, x, y sont un double, ch est un caractère, b est un octet, etc. Si vous voyez une question comme celle-ci, vous pouvez parier que «i» n'est pas son type attendu.
Une question similaire est; Cela ne boucle jamais, qu'est-ce que 'x'
Une autre question que j'aime bien est; Cette boucle est une boucle infinie, quelles sont les valeurs possibles de x. (: J'en compte douze :)
la source
Je sais que c'est une question Java, mais considérer la question pour d'autres langages est intrigant.
En C, un type simple tel que 'int' pourrait présenter un comportement 'se terminer avant que l'univers ne devienne froid' si 'i' était déclaré comme volatile (le compilateur serait donc forcé de faire deux lectures de 'i' pour chaque itération) et si «i» était réellement en mémoire où quelque chose d'autre pourrait l'affecter. Ensuite, la boucle se terminait lorsque «i» changeait entre les deux lectures d'une seule itération. ( Ajouté : un endroit possible - dans un micro-ordinateur où 'i' est en fait situé à l'adresse d'un port d'E / S, peut-être connecté à un capteur de position. Ce serait plus plausible si 'i' était une variable de pointeur ( un pointeur vers la mémoire volatile) et l'instruction était '
while (*i == *i);
'.)Comme en témoignent d'autres réponses, en C ++, l'opérateur '==' peut être fourni par l'utilisateur si i est d'une classe définie par l'utilisateur, donc tout est possible.
Un peu comme NaN, dans un langage basé sur SQL, la boucle ne serait pas infinie si la valeur de i était NULL; cependant, toute valeur non NULL rendrait la boucle infinie. C'est un peu comme Java, où n'importe quel nombre (par opposition à NaN) rend la boucle infinie.
Je ne vois pas que la construction ait une utilité pratique, mais c'est une question triviale intéressante.
la source
J'ai été surpris de ne pas voir cette solution:
En réponse à un commentaire, essayez d'exécuter ceci:
x devrait toujours égaler l'arc sinus (sin (x)) en théorie, mais en pratique ce n'est pas le cas.
la source
x
, ce qui devrait donner exactement le même résultat avec exactement la même inexactitude. Arcsin ne peut pas inverser le résultat d'un péché avec des nombres à virgule flottante car la valeur transmiseasin()
ne sera pas exactement précise. Par conséquent, le résultat deasin()
sera inexact, rendantx == asin(sin(x))
faux. De plus, arcsin n'annule pas nécessairement une opération sin - la fonction sin peut donner le même résultat pour plusieurs valeurs de x, c'est pourquoiasin()
ne renvoie que des nombres compris entre -π / 2 et π / 2.Pas une boucle infinie, un fil :)
la source
i == i
n'est pas atomique. Prouvé par un tel programme:Mise à jour Voici un autre exemple de boucle non infinie (aucun nouveau thread n'est créé).
la source
while (i == i);
ne s'exécutera jamais.