2 Stimmen

Ist es möglich, dass a==a für eine Variable a in Java falsch ausgewertet wird?

Mir wurde diese etwas obskure, aber interessante Frage über das Verhalten von Java gestellt. Irgendwelche Ideen?

7voto

st0le Punkte 32967

Ja, versuch das mal...

public class Main
{
  public static void main(String[] args)
  {
    double a = Double.NaN;
    if( a == a ) System.out.println("equal");
  }
}

http://www.ideone.com/K0d2j

6voto

Tom Hawtin - tackline Punkte 142461

Ja, für float o double NaN s (aber nicht Float o Double ). Abschnitt 4.2.3 der JLS 3rd Ed. Ich glaube, IEEE 754 definiert den Vorgang auf diese Weise. Das sind die einzigen Fälle.

1voto

Wie giddy schon sagte, kann die Gleichzeitigkeit alles durcheinander bringen. Ich habe gerade dies versucht:

public class Madness {

    private static volatile long a = 0;

    public static void main(String[] args) {

        long good = 0;
        long bad = 0;

        new Thread() {
            {
                setDaemon(true);
            }

            public void run() {
                while (true)
                    a++;
            }
        }.start();

        long print = System.currentTimeMillis() + 1000;

        while (true) {
            if (a == a)
                good++;
            else
                bad++;
            if (System.currentTimeMillis() > print) {
                System.out.println(String.format("%d / %d", good, bad));
                print = System.currentTimeMillis() + 1000;
            }
        }

    }

}

Die Ausgabe war:

19936409 / 382
38360780 / 640
56895813 / 898
75827635 / 1159
94500958 / 1423
113184503 / 1701
131711068 / 1960
150423573 / 2239
168898106 / 2509

Allerdings handelt es sich hier um einen Fall, der speziell für diesen Zweck konzipiert wurde. Das Entfernen der flüchtigen auf a verändert die Dinge. Ich sehe einige anfängliche "schlechte" Treffer, aber dann scheint alles gut zu sein. Ich habe nicht nachgeforscht, aber ich habe das Gefühl, dass es etwas mit der Hot-Spot-Optimierung des Codes nach einer gewissen Anzahl von Iterationen zu tun hat.

1voto

Peter Lawrey Punkte 511323

Der Code für Double.isNaN()

static public boolean isNaN(double v) {
    return (v != v);
}

Das klingt wie eine Frage für ein Vorstellungsgespräch. Eine ähnliche Frage, wann ist x == x + 0 falsch, die mehr Antworten hat. ;)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X