Forum: PC-Programmierung Invinity in Java


von Jax (Gast)


Lesenswert?

Hi,
angenommen man speichere in einer Variable(bspw eine des Types float) 
das Ergebnis einer Division. Diese Division sei nun eine Division durch 
0. Das Ergebnis wird nun ausgegeben. Auf der Konsole wird nun Infinity 
ausgegeben.
Meine Frage ist nun ob man aus dem Wert der Ergebnisvariable auslesen 
kann,  ob eine Division durch null stattgefunden hat.?

Hier nochmal der Code:
1
//...
2
float test = 2.3f/0;
3
System.out.print(test);
4
/...

von technofreak (Gast)


Lesenswert?

Hallo,
probiere es doch einfach aus.

Ein "anständiger" Hochsprachen-Compiler sollte eine solche klar 
formulierte "Division duch Null" gar nicht akzeptieren ...

Um das zur Laufzeit abzufangen gibt es, soviel ich weiß, Exceptions ...

von Klaus W. (mfgkw)


Lesenswert?

technofreak schrieb:
> Ein "anständiger" Hochsprachen-Compiler sollte eine solche klar
> formulierte "Division duch Null" gar nicht akzeptieren ...

Ein anständiger Compiler sollte das sehr wohl, weil pos. bzw. negativ 
Unendlich das richtige Ergebnis ist (außer bei 0/0, dann kommt wirklich 
ein undefinierter Wert raus).

Nachdem in IEEE 754 das klar definiert ist, ist es auch das richtige 
Verhalten, und mit C99 existieren auch die Werkzeuge dafür, um das 
abzufragen (z.B. isnan() und Konsorten).

Wie das in Java ist, weiß ich nicht, aber "sollte nicht akzeptieren" 
wollte ich jetzt nicht so stehen lassen.

von Radler (Gast)


Lesenswert?

Da sollte eine ArithmeticException geworfen werden.
Hätte den TO eine Minute gekostet das auszuprobieren.

von Jax (Gast)


Lesenswert?

Radler schrieb:
> Da sollte eine ArithmeticException geworfen werden.
> Hätte den TO eine Minute gekostet das auszuprobieren.

Der Quotient "test" wird später als Parameter übergeben. Von da her muss 
man dann schon aus der Variable auslesen können, ob der wert Infinity 
ist. Ansonsten würde ich auch einfach vor der Division überprüfen und 
dann einen entsprechenden Parameter an die Methode übergeben.

von technofreak (Gast)


Lesenswert?

Hallo,
fangen wir mal weiter vorne an. Das Code-Snippet von Jax würde in der 
"realen" Welt so auch nicht vorkommen.

I.d.R. tritt eine Division durch Null bei der Division zweier Variablen 
auf, deren Wert der Compiler zum Zeitpunkt der Compilierung noch gar 
nicht kennt.
Hier habe ich gelernt (Dino aus den 80er Jahre mit 
Mainframe-COBOL/FORTRAN/ASSEMBLER programmiert), das eine Division durch 
Null nicht vorkommen darf. Fertig.

Also könnte ich im Vorfeld prüfen, ob der Divisor ungleich Null ist und 
erst dann darf ich die Division durchführen. Das macht man natürlich 
nicht bei jeder Division. Klar.
Meistens führt aber eine unglückliche Kombination von Eingabeparametern 
dazu, das eine "Division durch Null" auftritt. Somit liegt das Problem 
also schon viel früher im Programmcode.
Eine Division duch Null führt in fast allen Programmiersprachen 
unweigerlich zum Programmabsturz, da die meisten Laufzeitsysteme prüfen, 
ob das CPU-Register "Division durch Null" gesetzt ist und dann das 
Programm abbrechen. Somit ist eine umfangreiche Vorabprüfung und eine 
vernünftiger Hinweis an den Programmbenutzer notwendig, der ihn darauf 
hinweist, das was schiefgelaufen ist.

von Jax (Gast)


Lesenswert?

Hmm, oke. Ist mir zwar bis jetzt noch nicht vorgekommen... aber daran 
sollte es nun schlussendlich auch nicht scheitern. Heißt: 
Prüfen->Parameter übergeben.

Danke an alle

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

technofreak schrieb:
> Hallo,
> fangen wir mal weiter vorne an. Das Code-Snippet von Jax würde in der
> "realen" Welt so auch nicht vorkommen.

Warum denn nicht? Das Ergebnis ist wohldefiniert.

> I.d.R. tritt eine Division durch Null bei der Division zweier Variablen
> auf, deren Wert der Compiler zum Zeitpunkt der Compilierung noch gar
> nicht kennt.
> Hier habe ich gelernt (Dino aus den 80er Jahre mit
> Mainframe-COBOL/FORTRAN/ASSEMBLER programmiert), das eine Division durch
> Null nicht vorkommen darf. Fertig.

Schau mal in die Quellen der newlib zum Beispiel

http://sourceware.org/cgi-bin/cvsweb.cgi/~checkout~/src/newlib/libm/mathfp/e_acosh.c?rev=1.2&cvsroot=src

Man beachte die Zeile
1
return (x-x)/(x-x);

oder
1
    /* purge off exception values */
2
        if(hy==0||(hx>=0x7f800000)||               /* y=0,or x not finite */
3
           (hy>0x7f800000))                        /* or y is NaN */
4
            return (x*y)/(x*y);
aus 
http://sourceware.org/cgi-bin/cvsweb.cgi/~checkout~/src/newlib/libm/mathfp/e_acosh.c?rev=1.2&cvsroot=src

D.h. wenn y = 0 ist, wird y/y zurückgegeben.

Andere Bibliotheken maches das ähnlich.

von Klaus W. (mfgkw)


Lesenswert?

technofreak schrieb:
> Hier habe ich gelernt (Dino aus den 80er Jahre mit
> Mainframe-COBOL/FORTRAN/ASSEMBLER programmiert), das eine Division durch
> Null nicht vorkommen darf. Fertig.

ok, aber die Welt hat sich weiterentwickelt.

Der OT hat nunmal + oder - inf in seinem Ergebnis.
Dazu kann es auch kommen, wenn man nicht durch 0.0 teilt; ein großer 
durch einen sehr kleinen Wert zu teilen reicht dazu.

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Jax schrieb:
> Meine Frage ist nun ob man aus dem Wert der Ergebnisvariable auslesen
> kann,  ob eine Division durch null stattgefunden hat.

Kann man nicht, du kannst aber prüfen ob das Ergbis Inf oder NaN ist.
http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/Float.html#isInfinite%28float%29
http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/Float.html#isNaN%28float%29

Radler schrieb:
> Da sollte eine ArithmeticException geworfen werden.
> Hätte den TO eine Minute gekostet das auszuprobieren.

Soll es nicht! Und der TO hat es ausprobiert, das Ergebis ist Inf so 
wie von Klaus Wachtler korrekt begründet wurde (auch in Java)!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.