Typkonvertierung

Status
Nicht offen für weitere Antworten.

Bit2_Gosu

Bekanntes Mitglied
Hallo !!

Ich habe eine double Variable x, die irgendwann während meines Programms den Wert -Infinity erreicht.
Wenn ich x ausgebe, wird -Infinity ausgegeben.
Wenn ich Math.round(x) ausgebe, wird -9223372036854775808 ausgegeben.

Warum denn gerade diese Zahl ?? Ich weiß, dass diese Zahl das maximale ist, was in 8 byte reinpasst (oder so ähnlich ;)) zum beispiel in einem long oder so...

aber warum denn in diesem Fall 8 byte ???

und warum ist (int) -9223372036854775808 = 0 ???

ich weiß, dass -9223372036854775808 nicht in die 4 byte vom integer reinpasst, aber warum wird dann das ganze ausgerechnet zu 0 ?



Vielen Dank schon mal für Eure Hilfe !!!
 

nebulo

Bekanntes Mitglied
Hallo,

was sollte Math.round(-infinity) deiner meinung nach den ergeben, wenn nicht die kleinste darstellbare Zahl?

Das sind die Wertebereiche der Gleitkommazahlen:

float 4 Byte 1.2E-38 3.4E+38 6-stellig %f
double 8 Byte 2.3E-308 1.7E+308 15-stellig %lf
long double 10 Byte 3.4E-4932 1.1E+4932 19-stellig %Lf


Was du das mit dem int für ein Ergebniss hast ist mir auf anhieb nicht ganz klar. Aufjedenfall gibt es einen Überlauf da ein Int unter modernen OS nur 4 Byte groß ist. Schick mal einen Codeauschnitt.

Und vielleicht könntest du mal konzeptionell erläutern was du überhaupt machen willst. Damit ich Dir versuchen kann einen Lösungsansatz aufzuzeigen.

Gruß nebulo
 
G

Guest

Gast
public int rechnePx(double x, float vg)
{
int px;
px = (int) Math.round(x);
return px;
}
 

Bit2_Gosu

Bekanntes Mitglied
sry wegen des posts oben... und danke schon mal


Code:
public void bla(double x)
{	
    System.out.println(Math.round(x));    
}

x hat den Wert -Infinity

Die Funktion gibt -9223372036854775808 aus.

Ich frage mich nur warum. Ich meine, warum werden dem System.out.println nicht mehr als 8 bytes zur Verfügung gestellt. Es handelt sich ja hier weder um double noch um long double usw. Nur das x ist ja double.
Aber Math.round(x) ist ja eigentlich kein Typ, dachte ich.


Code:
public void blubber(double x)
{	
    int baum = (int) Math.round(x);
    
    System.out.println(baum);    
}

Die Funktion gibt mit x= -Infinity 0 aus. Ich frage mich halt nur, warum gerade 0...


Es geht mir übrigens nicht um eine Lösung , oder so. Ich frage aus reinem Interesse.
 

nebulo

Bekanntes Mitglied
Code:
public void bla(double x)
{   
    System.out.println(Math.round(x));   
}

Math.round(x); ist kein Typ sondern eine Methode die aber in diesem Fall einen Double zurück gibt (siehe http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Math.html ). System.out.prinltn(...); ist auch eine ganz normale Methode wie deine bla. In dem konkreten Fall sieht println etwa so aus:

Code:
public void println(double text){
//Implementierung um text auf der kosole auszugeben
}


Zum zweiten Teil deiner Frage, scheinbar ist es so das der int bei einem Überlauf / Unterlauf keinen besonderen Wert annimmt sondern bei

Integer.MIN_VALUE-1 den Wert Integer.MAX_VALUE annimmt und bei Integer.MAX_VALUE+1 den Wert von Integer.MIN_VALUE ich denke auf diesem Weg kommt die 0 zustande. Wie ganz genau kann ich dir leider auch nicht erklären.

Da du Dich generell für Fließkommzahlen etc. zu interessieren scheinst. Sieh dir mal folgendes an:

http://de.wikipedia.org/wiki/IEEE754

dort findest du Einiges dazu wie Gleitkommazahlen in modernen Rechnern auf Hardwareebene repräsentiert werden.
 

Eldar

Aktives Mitglied
-9223372036854775808
ist binär eine 1 mit 63 Nullen
in int umgewandelt werden die oberen Bits abgeschnitten, es bleiben Nullen.. ergo 0 (achtung, das höchstwertige Bit wird zum Vorzeichen!).
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben