NaN - Operationen ohne Fehler?

SimProtect

Aktives Mitglied
Hallo,

Ich habe mal eine - vielleicht recht doofe - Frage.

Kurz zu Erklärung: Seit Wochen arbeite ich an einem Simulationsprojekt in Java. Die Agenten haben verschiedene Basisbewegungsoperationen: Zufall, Fliehe, GeheZu usw.
Bei der Flucht hatte ich nun eine Kleinigkeit übersehen. Wenn der Agent die gleiche Position besetzt, wie der Agent, vor dem er fliehen möchte, kommt es in der Vektorrechnung zu einem Fehler: Ein Richtungsvektor kann nicht bestimmt werden. Das Endergebnis ist, dass der entsprechende Agent die Position (NaN / NaN) einnimmt.
Der Fehler selbst war leicht zu beheben.

Was ich mich jetzt aber frage: Wieso kann Java damit weiter arbeiten?
Trotz dieser Werte lief die Simulation 'normal' weiter. Ich habe den Fehler erst festgestellt, als eine Abbruchbedingung nicht erfüllt werden konnte, obwohl sie längst fällig gewesen wäre.

In der Zwischenzeit wurde mit diesen Koordinaten mehrere If-Bedingungen durchlaufen - alles vergleichende Operationen wie '<' '<=' '==' usw. . Zudem wurden die NaN mehrfach zur Berechnung neuer Positionen verwendet (im Wesentlichen Addition, Subtraktion und Multiplikation)

Mich wundert jetzt einfach, dass keine dieser Operationen eine Exception oder einen großen Fehler verursacht hat. Das hat die Fehlersuche deutlich erschwert^^

Warum lässt Java Vergleiche und sogar mathematische Operationen mit diesem Wert zu? Hat das irgendwo eine praktische Anwendung?

Bitte nicht falsch verstehen: Das soll weder eine Kritik an der Sprache, noch sinnloses Gejammer werden. Mein Problem ist ja abgefangen. Mir geht es mir mehr um das Verständnis für diese Mechanik und warum da keine Exception greift. Ich meine, durch eine Exception werde ich auf das Problem aufmerksam und kann es entweder direkt beheben oder eine Lösung über einen Catch-Block entwickeln. So aber kann es ja zu ungewolltem Verhalten führen, dass man vielleicht gar nicht bemerkt.
 

Highchiller

Bekanntes Mitglied
Das ist schon fast eine philosophische Frage und lässt sich glaube ich nicht so leicht beantworten. Ich kann es trotzdem mal versuchen.

Wozu der Blödsinn?
Natürlich ist die zu Grunde liegende Mathematik Schuld. Dafür sollte man wissen das Double natürlich nur reelle Zahlen darstellt. Doch nun gibt es ein paar Sonderzahlen, die teilweise über die rellen Zahlen hinaus gehen (Imaginäre Zahlen) oder Zahlen die bis Heute nicht definiert wurden, so zum Beispiel die Zahl 0/0.

Nun benötigt man jedoch die Möglichkeit auch mit diesen Zahlen zu rechnen. Nur weil double diese nicht anzeigen kann, heißt das nicht das diese nicht auch existiert. Der Double Wert NaN ist sogar als 0/0 hard-gecoded und konstant. Praktischerweise hat man da auch gleich die imaginären Zahlen hinzugefügt, denn diese sprengen die reelle Welt.

Wie rechnet man damit?
Ein Beispiel wo es etwas deutlicher wird ist eventuell +/- Unendlich. Diese beiden "Zahlen" sind noch im reellen Raum vertreten, jedoch nicht darstellbar von double (logisch). Nun sagt man einfach das alles was über den Darstellungsbereich von Double hinausragt ist Unendlich. Je nachdem in welche Richtung halt positiv oder negativ. Dennoch kann man damit rechnen, wie man es in der normalen Mathematik auch kann.
Java:
+Inf > +Inf // False
-Inf < +Inf // True
+Inf - 3 == +Inf // True
und so weiter. Diese Eigenschaften sollten eigentlich eindeutig sein, auch für Mathelaien.

Das gleiche gilt auch für NaN. Nur weil sie nicht dargstellt werden können, kann man doch mit ihnen rechnen.
Java:
NaN == NaN // false
NaN < NaN // false
NaN + 3 // ist immer noch NaN
Alle Vergleiche unter NaNs sind immer false. Das ist deshalb einleuchtend, weil man ja nicht weiß worum es sich handelt. Eventuell ist ein NaN die Wurzel aus -1 (was i wäre) und das andere NaN die Wurzel aus -4 (was 2i wäre). Die beiden sind natürlich nicht gleich, im Speicher unterscheiden sie sich aber nicht. Also wird sporadisch immer false ausgegeben. So kann man in der Mathematik zum Beispiel auch nicht ohne weitere sagen ob i > 2i ist. Denn was heißt "größer" in der Imaginären Welt? Ohne entsprechende Definitionen lässt sich keine Aussage treffen.
Dennoch existieren die grundlegenden mathematischen Regeln. Nur können wir den Raum der Imaginären Zahlen nicht mehr verlassen, wenn wir einmal drin sind. (Streng mathematisch könnten wir Elemente finden die auch im reellen Raum existieren, allerdings lässt sich das auf Bit-Ebene eben nicht umsetzen).

Was ist mit 1/0?
Im übrigen könnte jetzt jemand einwerfen dass auch 1/0 nicht definiert ist. Das ist richtig, allerdings existiert der Grenzwert für die Folge 1/x für x gegen 0 (für positive x). Und der ist eben unendlich. Daher hat man so auch Double.Infinity definiert, weil es halt der realität am nähsten ist.

Zusammengefasst heißt das:
Man will mit diesen Konstanten erreichen, dass Double den gesamten Raum der Zahlen abdecken kann. Dafür gibts 4 Fälle (wenn man -/+ Varianten zusammen wirft):
  1. Die Zahl ist reell und lässt sich mit der Größe von Double darstellen => wie gehabt, wird als double dargstellt
  2. Die Zahl ist zu groß als das sie mit double dargstellt werden kann und ist reell => +/- Infinity
  3. Die Zahl ist zu klein und verlässt damit die Genaugkeitsspanne von Double und ist reell => dafür gibts extra + und - 0.0 (auch solche Konstanten)
  4. Die Zahl ist nicht reell => NaN

Mehr geht nicht. Damit kann Double alles was eine "normale" Zahl aus der Realität auch kann, wird jedoch approximiert durch die begrenzenten Resourcen die einem PC nun mal zur verfügung stehen.
 
Zuletzt bearbeitet:

SimProtect

Aktives Mitglied
Suuuuuper! Vielen Dank für diese ausführliche Erklärung :)

Ich hatte jetzt in meiner Tunnelblickwelt gar nicht an so "Späße" wie imaginäre Zahlen und co gedacht, sondern nur mein Problem gesehen und mich entsprechend gewundert. Wieder mal nicht über den Tellerrand hinausgedacht.

Auf alle Fälle gut zu wissen, wenn ich mal wieder mehr oder weniger heimlich durch 0 teile. Tatsächlich ist hier eine 0/0-Division das Problem gewesen. Davon war ich auch gestern ausgegangen, aber ich hatte wie gesagt nicht viel weiter gedacht^^
 

Highchiller

Bekanntes Mitglied
Besonders ärgerlich wirds wenn dir das Programm auftischt das -0.0 nicht gleich +0.0 ist :D

Da fängt man schon mal an zu Zweifeln ^^ auch wenn es eigentlich richtig ist.

Schon verrückt, in meinem Mathestudium hat man immer gesagt: "NIEMALS durch 0 teilen. Sonst impludiert das Universum." :D aber Java macht das einfach... eiskalt...
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
H Frage zu arithmetischen Operationen Java Basics - Anfänger-Themen 20
J Listen Operationen Java Basics - Anfänger-Themen 4
D Algorithmus in Pseudocode mit log2(n) Operationen erstellen Java Basics - Anfänger-Themen 3
Hacer Operationen einfach verketteter Listen Java Basics - Anfänger-Themen 22
S Warum muss ich die operationen mit AffineTransform in umgekehrter Reihenfolge ausfuehren..? Java Basics - Anfänger-Themen 4
B Matrizen Operationen Java Basics - Anfänger-Themen 7
B AffineTransform - Reihenfolge der Operationen Java Basics - Anfänger-Themen 3
G Messen von Elementaren Operationen Java Basics - Anfänger-Themen 3
S Liste von möglichen Operationen Java Basics - Anfänger-Themen 2
B genaue Anzahl der Operationen in Schleifen Java Basics - Anfänger-Themen 5
C Operationen auf Bitebene und Verschiebeoperatoren wichtig? Java Basics - Anfänger-Themen 26
Haave Postfix-Rechner: mehrere math. Operationen nacheinander ausführen Java Basics - Anfänger-Themen 8
M Bit/Byte Operationen Java Java Basics - Anfänger-Themen 8
B math. Operationen + Ausgabe Fehler :S Java Basics - Anfänger-Themen 5
K println - Klammern von Operationen Java Basics - Anfänger-Themen 4
O Operationen auf ein Set Java Basics - Anfänger-Themen 3
Q mathematische Operationen als Methode und nicht Infix-Operator Java Basics - Anfänger-Themen 14
X Zählen von arithmetischen Operationen und Vergleichsoperationen Java Basics - Anfänger-Themen 7
R Kommandozeile Operationen Java Basics - Anfänger-Themen 3
G Strings Operationen Java Basics - Anfänger-Themen 7
G String-Operationen Java Basics - Anfänger-Themen 6
F Operationen mit Zeichenketten Java Basics - Anfänger-Themen 8
ven000m Aritmethische Operationen Java Basics - Anfänger-Themen 7
S Stack-Operationen Java Basics - Anfänger-Themen 59
J Delay erzeugen, ohne Programm zu blockieren Java Basics - Anfänger-Themen 7
P Main Methode scheint Constructor aufzurufen, ohne dass es so gecoded ist Java Basics - Anfänger-Themen 2
iAmFaiinez Primzahlen Tester ohne Array Java Basics - Anfänger-Themen 4
V JSON-Objs aus JSON-Obj filtern und löschen (Manipulation ohne Kenntnis der vollst. Struktur) Java Basics - Anfänger-Themen 12
O HashTable kann ohne Performance-Verlust in Multithreaded-Anwendungen eingesetzt werden. Java Basics - Anfänger-Themen 6
T Mehrere if bedingungen ohne & Java Basics - Anfänger-Themen 2
M methode aufrufen ohne parameter Java Basics - Anfänger-Themen 1
M Verständnisfrage: Warum wird die Datei ohne Inhalt übertragen Java Basics - Anfänger-Themen 3
G Programm läuft durch, ohne Eingabe aus dem Chat abzuwarten Java Basics - Anfänger-Themen 4
Mugetsu35 ArrayList Update ohne Index Java Basics - Anfänger-Themen 6
P 2n Potenzieren ohne Math.pow oder pow Java Basics - Anfänger-Themen 8
M 2d array ohne längen anlegen Java Basics - Anfänger-Themen 4
Zentriks Hilfe zu Sieb des Eratosthenes ohne boolean Java Basics - Anfänger-Themen 5
W GUI - JButton ohne Funktion? Java Basics - Anfänger-Themen 24
X Enum Abfrage ohne if, for, while oder switch Java Basics - Anfänger-Themen 21
R Buttons ohne Funktion Java Basics - Anfänger-Themen 2
JavaBeginner22 TextArea, ohne Zeilenumbruch? Java Basics - Anfänger-Themen 4
frager2345 Programm erstellen ohne Autoboxing und Unboxing Java Basics - Anfänger-Themen 13
J In der Ausgabe wird ohne Eingabe in den else Block gesprungen. Java Basics - Anfänger-Themen 0
J In der Ausgabe wird ohne Eingabe in den else Block gesprungen. Java Basics - Anfänger-Themen 5
S Was macht ++ ohne Schleife? Java Basics - Anfänger-Themen 4
berserkerdq2 An selbst ersteller txt Datei immer Text dranhängen, ohne den vorherign Text zu löschen Java Basics - Anfänger-Themen 8
U Methode wird genutzt, ohne dass ich die aufrufe? Java Basics - Anfänger-Themen 4
B Jar Dateien ohne IDE verwenden? Java Basics - Anfänger-Themen 1
M Wie verknüpfe ich eine Bedingung mit einer Methode ohne if-Verzweigung & Bedingungsoperator? Java Basics - Anfänger-Themen 2
M Konstruktor ohne Übergabe eines Wertes Java Basics - Anfänger-Themen 7
S Chars vergleichen ohne Betrachtung der Groß und Kleinschreibung Java Basics - Anfänger-Themen 7
javapingu Variablenwerte ändern ohne return Statement? Java Basics - Anfänger-Themen 7
R Frage zu Methoden (Rückgabewert u. ohne.) Java Basics - Anfänger-Themen 2
E Meine JCombobox werte an ohne selectiert zu haben Java Basics - Anfänger-Themen 6
T Eigene Exception - ohne werfen abfangen Java Basics - Anfänger-Themen 2
M for schleife ohne geschweifte Klammer Java Basics - Anfänger-Themen 15
KogoroMori21 Variable im Parameter und Ohne Java Basics - Anfänger-Themen 5
alice98 Erste Schritte Liste erstellen ohne vorgefertigte Klassen Java Basics - Anfänger-Themen 1
L Zufälligen Zahlencode, ohne mehrfacher Verwendung einer Ziffer Java Basics - Anfänger-Themen 15
Sinan Arrays auflisten ohne Wiederholung Java Basics - Anfänger-Themen 28
A Löschen von Leerzeichen in einem char array ohne methoden Java Basics - Anfänger-Themen 6
T Variable in for Schleife ansprechen ohne Array ? Java Basics - Anfänger-Themen 25
J Programm beenden ohne System.exit() oder Runtime.exit() Java Basics - Anfänger-Themen 5
S Teilen ohne Rest Java Basics - Anfänger-Themen 15
Tino1993 Ellipse über draw Funktion ohne spur wandern lassen Java Basics - Anfänger-Themen 6
C Array-Werte werden gemischt, ohne Logik Java Basics - Anfänger-Themen 2
C Programm ausführen ohne JRE? Java Basics - Anfänger-Themen 3
C NumberFormatException: null ohne Ausnahmebehandlung stoppen Java Basics - Anfänger-Themen 7
P Methode trim() ohne StringBuilder Java Basics - Anfänger-Themen 1
B Variablen Variablen übertragen ohne Klassen Java Basics - Anfänger-Themen 5
K Programm stoppt einfach ohne Grund Java Basics - Anfänger-Themen 4
C Projekte in 2 versch. Arbeitsbereichen: auf ein Projekt verweisen (ohne Fehler zu bekommen) Java Basics - Anfänger-Themen 8
L Zufälliges Objekt aus der ArraylList ohne java.util.Random Java Basics - Anfänger-Themen 56
Z Methode zum Heraufinden von Anagrammen ohne Java API, Ausnahme String Java Basics - Anfänger-Themen 14
Z Attribut ändern ohne Kontrollstruktur Java Basics - Anfänger-Themen 2
R Boolean value ohne Kontrollstrukturen ändern Java Basics - Anfänger-Themen 5
C Wie habt Ihr angefangen mit der Java Programmierung, ohne Programmiervorkenntnisse Java Basics - Anfänger-Themen 8
S Klassenmethode ohne static Java Basics - Anfänger-Themen 2
M Prüfen auf null ohne NPE Java Basics - Anfänger-Themen 1
M Bubblesort ohne Array Java Basics - Anfänger-Themen 30
J Array vertauschen ohne ein neues anzulegen?! Java Basics - Anfänger-Themen 10
F Hilfe - Wahrheitswert überprüfen ohne If Java Basics - Anfänger-Themen 2
ZH1896ZH Java-SemesterTest ohne Lösung :( Java Basics - Anfänger-Themen 47
V Erste Schritte Berechnen von Sinus; sin(x) ohne Math.* Java Basics - Anfänger-Themen 1
C Teilbarkeit ohne "if" Java Basics - Anfänger-Themen 3
M Double Wert nach n abschneiden ohne zu runden Java Basics - Anfänger-Themen 1
B Input/Output System.out.print mit und ohne "" Java Basics - Anfänger-Themen 5
J Mein Programm beendet sich ohne mein Zutun Java Basics - Anfänger-Themen 9
S Daten speichern, ohne Datenbank Java Basics - Anfänger-Themen 8
D Eingabe einscannen, ohne vorher einen Datentypen anzugeben? Java Basics - Anfänger-Themen 1
AnnaBauer21 GridBagLayout JLabel weightx: Unterschiedliche Breite mit & ohne Text Java Basics - Anfänger-Themen 6
F Buchstaben in einem String vertauschen (Ohne replace) Java Basics - Anfänger-Themen 10
R for schleife ohne klammer Java Basics - Anfänger-Themen 14
O Primzahl rekursiv mit einem Wert ohne i, wie? Java Basics - Anfänger-Themen 6
C Problem: PC ohne Internet und keine Möglichkeit Programme zu laden Java Basics - Anfänger-Themen 5
C unverständlicher Code Attribute ohne Datentyp, wie geht das? Java Basics - Anfänger-Themen 8
C Konstruktor mit und ohne Parameterliste Java Basics - Anfänger-Themen 13
B Potenzrechnung mit WindowBuilder ohne math.pow() Java Basics - Anfänger-Themen 1
Jackii ArrayList ausgabe ohne Dopplung Java Basics - Anfänger-Themen 11
E Pfade eines Baums angeben ohne Rekursion Java Basics - Anfänger-Themen 20

Ähnliche Java Themen

Neue Themen


Oben