Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Float.isNaN buggy?

0 views
Skip to first unread message

Markus Riehl

unread,
Jul 17, 2001, 6:21:42 AM7/17/01
to
Hallo,


ich hatte vor ein paar Stunden ein Problem gepostet, dass ich ab und zu folgende
Fehlermeldung bei der Verwendung von Swing-Komponenten erhalte:


java.lang.IllegalArgumentException: Illegal Load: 0.9
at java.util.Hashtable.<init>(Unknown Source)
...


Ich habe mir den Sourcecode der betroffenen Klassen nun etwas näher betrachtet.
Die einzige Möglichkeit, wie diese Exception erzeugt werden kann, ist, dass die
Prüfung


Float.isNaN (0.9)


fehlschlägt, was sie natürlich nicht dürfte. Der Sourcecode für diese Methode
ist der Folgende:


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


Diese Prüfung sollte für 0.9 doch eigentlich niemals fehlschlagen, oder? Kann
ein Darstellungsproblem von Float-Werten auf bestimmten Betriebssystemen dafür
verantwortlich sein? Bei Sun war jedenfalls kein entsprechender Bugreport zu
finden.


Bin sehr auf Eure Meinung gespannt!


Runtime: Java PlugIn V1.3.1


Viele Grüße


Markus

--
__________________________________________________________
News suchen, lesen, schreiben mit http://newsgroups.web.de

Harald Krause

unread,
Jul 17, 2001, 8:30:01 AM7/17/01
to
Hi, Makus,
"Markus Riehl" <markus...@softwareag.com> schrieb im Newsbeitrag
news:3b5411b6$1...@netnews.web.de...

> Hallo,
>
> ich hatte vor ein paar Stunden ein Problem gepostet, dass ich ab und zu
folgende
> Fehlermeldung bei der Verwendung von Swing-Komponenten erhalte:
>
>
> java.lang.IllegalArgumentException: Illegal Load: 0.9
> at java.util.Hashtable.<init>(Unknown Source)
> ...
>
> Ich habe mir den Sourcecode der betroffenen Klassen nun etwas näher
betrachtet.
> Die einzige Möglichkeit, wie diese Exception erzeugt werden kann, ist,
dass die
> Prüfung

> Float.isNaN (0.9)

> fehlschlägt,

Was heißt denn fehlschlägt? Dass sie eine Exception wirft?
Nach dem Stacktrace von dir wird diese nicht in isNAN(..) geworfen.

Oder meinst du - dass die Methode false liefert?

> was sie natürlich nicht dürfte. Der Sourcecode für diese Methode
> ist der Folgende:

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

Sollen das die Java-Sourcen sein? Oder ist das eine eigene
Implementierung?
Die Doku zu java.lang.Float.isNaN(float) sagt jedenfalls:
"returns true if the argument is NaN; false otherwise."

Also wenn du meinst die Methode liefert false ist dass doch
völlig korrekt und in Ordnung.

> Diese Prüfung sollte für 0.9 doch eigentlich niemals fehlschlagen, oder?
Kann
> ein Darstellungsproblem von Float-Werten auf bestimmten Betriebssystemen
dafür
> verantwortlich sein? Bei Sun war jedenfalls kein entsprechender Bugreport
zu
> finden.

Ich weiß noch immer nicht was du mit "fehlschlagen" konkret meinst.
Ich weiß nur, dass man Vergleiche mit Gleitkommazahlen
nicht machen sollte, wobei dies vielleicht ein sinnvoller Sonderfall ist.

> Bin sehr auf Eure Meinung gespannt!

Meinung Wozu?

MFG
Harry

--
Hompage & FAQ von de.comp.lang.java: www.dclj.de


Markus Riehl

unread,
Jul 17, 2001, 9:01:40 AM7/17/01
to
Hi Harald,


"Harald Krause" <Harald...@de.bosch.com> wrote:
>> Die einzige Möglichkeit, wie diese Exception erzeugt werden kann, ist,
>dass die
>> Prüfung
>
>> Float.isNaN (0.9)
>
>> fehlschlägt,
>
>Was heißt denn fehlschlägt? Dass sie eine Exception wirft?
>Nach dem Stacktrace von dir wird diese nicht in isNAN(..) geworfen.
>
>Oder meinst du - dass die Methode false liefert?


Sorry, missverständlich ausgesdrückt. Damit die Exception (Illegal Load)
geworfen wird, muss Float.isNaN(0.9) true zurückliefern, was natürlich nicht
stimmt. Das meinte ich mit "fehlschlagen".


>> public static boolean isNaN(float v) {
>> return (v != v);
>> }
>
>Sollen das die Java-Sourcen sein? Oder ist das eine eigene
>Implementierung?


Die Sourcen. Ich finde die Prüfung auch etwas seltsam, aber irgendwas werden die
sich dabei schon gedacht haben. Was mich wundert ist, dass es eine Konstante NaN
gibt, gegen die aber nicht abgeglichen wird...


Sehr seltsam, das Ganze.

Aljoscha Rittner

unread,
Jul 17, 2001, 10:34:19 AM7/17/01
to
Markus Riehl <markus...@softwareag.com> schrieb:

> "Harald Krause" <Harald...@de.bosch.com> wrote:
>
>>> public static boolean isNaN(float v) {
>>> return (v != v);
>>> }
>>
>> Sollen das die Java-Sourcen sein? Oder ist das eine eigene
>> Implementierung?
>
>
> Die Sourcen. Ich finde die Prüfung auch etwas seltsam, aber irgendwas werden die
> sich dabei schon gedacht haben. Was mich wundert ist, dass es eine Konstante NaN
> gibt, gegen die aber nicht abgeglichen wird...
>
> Sehr seltsam, das Ganze.

Wenn ein float zu NaN geworden ist, dann ist der float-Wert zu keinem
anderem float-Wert vergleichbar. Nicht mal zu sich selbst. Das handelt
die VM ab.

Die Konstante NaN wird verwendet, damit man einen
Referenz-"nicht"-Wert hat, um aus einem float ein NaN zu machen.

Das sollte nie true liefern:

f = NaN;
f == NaN
f != NaN

aber:

f = NaN;
(f != f) == true

...wenn ich das NaN-Krams in Java richtig verstanden habe.

Sollte aber tatsächlich ein:

f = 0.9;
f != f == true

liefern, dann muß da wohl was schief laufen.

Gruß,
Josch.
--
Einige Tags in de.comp.lang.java ( siehe http://www.dclj.de/dcljstart.html )
[INFO] - Allgemeine Infos, z.B. Links auf Webseiten - keine Frage
[DISCUSSION] - Diskussion zu einem Java-spezifischen Thema - keine Frage
[ANNOUNCE] - Vorstellung neuer Software (möglichst nicht Kommerziell)

Markus Blatt

unread,
Jul 17, 2001, 2:57:04 PM7/17/01
to
Markus Riehl <markus...@softwareag.com> writes:

> Hallo,
>
>
> ich hatte vor ein paar Stunden ein Problem gepostet, dass ich ab und zu folgende
> Fehlermeldung bei der Verwendung von Swing-Komponenten erhalte:
>

Mmh, und warum hast du einen neuen Thrad eroeffnet, anstatt deine an
deine Frage diese Antwort zu haengen? Dann haette ich naemlich Deine
Frage noch mal lesen koenen.

>
> java.lang.IllegalArgumentException: Illegal Load: 0.9
> at java.util.Hashtable.<init>(Unknown Source)
> ...
>

Und wo in Deinem Code tritt die exception auf? Sieht mir danach aus,
als ob su Unsinnige Parameter vewendest.
Egentlich ist aber gegen einen load factor von 0.9 nichts einzuwenden
(oder steht da ein minus davor?), koennte also auch ein Bug sein.



>
> Ich habe mir den Sourcecode der betroffenen Klassen nun etwas näher betrachtet.
> Die einzige Möglichkeit, wie diese Exception erzeugt werden kann, ist, dass die
> Prüfung
>
>
> Float.isNaN (0.9)
>

NA also das wuerde im Gegensatz zur Doku stehen, bist du dir sicher?

Markus

--
Java-FAQ: http://www.dclj.de (da werden Sie geholfen!)

Markus Riehl

unread,
Jul 18, 2001, 2:42:42 AM7/18/01
to
Hallo Namensvetter,


Markus Blatt <mbl...@gmx.net> wrote:


>Markus Riehl <markus...@softwareag.com> writes:
>> ich hatte vor ein paar Stunden ein Problem gepostet, dass ich ab und zu
folgende
>> Fehlermeldung bei der Verwendung von Swing-Komponenten erhalte:
>>
>
>Mmh, und warum hast du einen neuen Thrad eroeffnet, anstatt deine an
>deine Frage diese Antwort zu haengen? Dann haette ich naemlich Deine
>Frage noch mal lesen koenen.


Das Thema ist inzwischen ein anderes. Im ersten Thread ging es hauptsächlich um
die Exception, in diesem um Float.NaN.


>> java.lang.IllegalArgumentException: Illegal Load: 0.9
>> at java.util.Hashtable.<init>(Unknown Source)
>> ...
>>
>
>Und wo in Deinem Code tritt die exception auf? Sieht mir danach aus,
>als ob su Unsinnige Parameter vewendest.
>Egentlich ist aber gegen einen load factor von 0.9 nichts einzuwenden
>(oder steht da ein minus davor?), koennte also auch ein Bug sein.


Ich verwende gar keine Hashtable, sie wird aber von einigen Swing-Komponenten
offensichtlich verwendet (steht auch über dem Fehler in meinem Posting). In
besagtem Beispiel war es die Instanziierung eines Fonts (new Font(...)) zur
Änderung eines JLabels bzw. einer Zelle einer JTable. Ist aber nur ein Beispiel,
der Fehler tritt auch bei anderen Komponenten auf. Laut Sourcecode wird der
Loadfaktor auch in der Exception so wie er ist ausgegeben, also muss er 0.9
gewesen sein und nicht etwa -0.9.
Hat aber wie gesagt nichts mit meinem Code zu tun sondern es handelt sich um
swinginterne Abläufe. Übrigens tritt der Fehler nicht immer auf. Der Code läuft z.
B. 50 Mal durch und wirft beim 51. Mal diese Exception.


>> Ich habe mir den Sourcecode der betroffenen Klassen nun etwas näher
betrachtet.
>> Die einzige Möglichkeit, wie diese Exception erzeugt werden kann, ist, dass
die
>> Prüfung
>>
>>
>> Float.isNaN (0.9)
>>
>
>NA also das wuerde im Gegensatz zur Doku stehen, bist du dir sicher?
>
>Markus


Die einzige andere Bedingung, die zu dieser Exception führen kann, ist, dass 0.9
< 0 ist :-)

Markus Riehl

unread,
Jul 18, 2001, 7:02:55 AM7/18/01
to
Hi Josch,


Aljoscha Rittner <ARit...@gmx.net> wrote:
>Wenn ein float zu NaN geworden ist, dann ist der float-Wert zu keinem
>anderem float-Wert vergleichbar. Nicht mal zu sich selbst. Das handelt
>die VM ab.
>
>Die Konstante NaN wird verwendet, damit man einen
>Referenz-"nicht"-Wert hat, um aus einem float ein NaN zu machen.
>
>Das sollte nie true liefern:
>
> f = NaN;
> f == NaN
> f != NaN
>
>aber:
>
> f = NaN;
> (f != f) == true
>

>....wenn ich das NaN-Krams in Java richtig verstanden habe.


>
>Sollte aber tatsächlich ein:
>
> f = 0.9;
> f != f == true
>
>liefern, dann muß da wohl was schief laufen.


Die Konstante Float.NaN wird mittels 0f / 0f berechnet. Ein Vergleich damit
sollte also tatsächlich immer false liefern. Ich stimme Dir zu, dass f == f immer
true liefern sollte für f=0.9, da aber dieser Vergleich offensichtlich ab und zu
false liefert, ist da wohl ein Bug. Kann evtl. denke ich auch am Prozessor
und/oder Betriebssystem liegen, der Fehler tritt nämlich nicht auf jedem Rechner
auf.

0 new messages