2009-05-08 8 views
11

Kürzlich, manchmal (selten), wenn wir Daten aus unserer Anwendung exportieren, enthält das Exportprotokoll Float-Werte, die wie "-1. # J" aussehen. Ich konnte es nicht reproduzieren, daher weiß ich nicht, wie der Float im Binärformat aussieht oder wie Visual Studio ihn anzeigt.Was bedeutet Gleitkommafehler -1. # J?

Ich habe versucht, den Quellcode für printf, aber habe nichts gefunden (nicht 100% sicher, dass ich die richtige Version aber ...).

Ich habe versucht zu googeln, aber Google wirft jede # weg, so scheint es. Und ich kann keine Listen von Float-Fehlern finden.

+0

Siehe auch: http://stackoverflow.com/questions/5541975/what-does-1-mean/5542066#5542066 –

Antwort

27

Es kann entweder negativ unendlich oder NaN (keine Zahl) sein. Aufgrund der Formatierung auf dem Feld unterscheidet printf nicht zwischen ihnen.

Ich habe versucht, den folgenden Code in Visual Studio 2008:

double a = 0.0; 
printf("%.3g\n", 1.0/a); // +inf 
printf("%.3g\n", -1.0/a); // -inf 
printf("%.3g\n", a/a); // NaN 

, die in der folgenden Ausgabe führt:

1.#J 
-1.#J 
-1.#J 

die 0,3 Formatierung Spezifikations Entfernung gibt:

1.#INF 
-1.#INF 
-1.#IND 

es ist also klar, 0/0 gibt NaN und -1/0 gibt negative Unendlichkeit (NaN, -inf und + inf sind die einzigen "er" Roneous "Fließkommazahlen, wenn ich mich richtig erinnere)

+0

Interessant ... Ich frage mich, warum es endet mit einem 'J' beim Abschneiden der Unendlichkeits-/NaN-Indikatoren? –

+14

Das J ist das Ergebnis des Rundens der "Ziffern" IN auf eine Stelle weniger. – RBerteig

+3

Die Übersetzung von NaN und INF in einen Code mit einer führenden Ziffer und einem Punkt ist ein IMHO ein grober Fehler. Es ist viel zu einfach, mit einem numerischen Feld in einer Textdatei zu enden, die (mit einem unvollkommenen, aber plausiblen Parser, zugegebenermaßen) als Wert +1 oder -1 gelesen werden kann, der dem Wert, der gedruckt wurde, ziemlich unähnlich ist. Es wäre viel besser, es als + # INF, - # INF und so weiter zu schreiben. – RBerteig