romy: Float, Double initialisieren

Hallo ihr Lieben,

ich habe gerade gelernt, dass man in Java eine Floatvariable nur mit einer Ganzzahl initialisieren kann, aber die Doublevariable auch mit einer Fließkommazahl. Warum?

Beispiel:
float blubber=1 ->zulässig
float blubber=1.0 ->unzulässig, stattdessen gilt: float blubber=1.0f
double blubber=1.0 ->zulässig

Float und Double sind doch beides Fließkommazahlen, warum kann ich nicht beide damit initinalisieren? Ich hhabe nur die Aussage bekommen, dass es halt so ist, dass stellt mich nicht so richtig zufrieden ;)

Danke!

ciao
romy

  1. Hi!

    ich habe gerade gelernt, dass man in Java eine Floatvariable nur mit einer Ganzzahl initialisieren kann, aber die Doublevariable auch mit einer Fließkommazahl. Warum?

    1.0f ist doch eine Gleitkommazahl. ;-) Double wäre korrekterweise 1.0d

    mfG

    --
    sh:( fo:§ ch:{ rl:? br:> n4:# ie:} mo:? va:) de:µ zu:| fl:( ss:{ ls:~ js:)
    "And all those exclamation marks, you notice? Five? A sure sign of someone who wears his underpants on his head."
    (Terry Pratchett)
    1. Hi Benjamin,

      ich habe gerade gelernt, dass man in Java eine Floatvariable nur mit einer Ganzzahl initialisieren kann, aber die Doublevariable auch mit einer Fließkommazahl. Warum?
      1.0f ist doch eine Gleitkommazahl. ;-) Double wäre korrekterweise 1.0d

      Ja, wenn ich bei beiden Typen gezwungen wäre, das jeweilige Zeichen dahinter anzugeben, fände ich es logisch ;) Aber beim double brauche ich es ja scheinbar nicht, oder ist das eh unsauber.
      Wie würdest du die Datentypen jeweilig initialisieren?

      ciao
      romy

      1. Hi!

        Ja, wenn ich bei beiden Typen gezwungen wäre, das jeweilige Zeichen dahinter anzugeben, fände ich es logisch ;) Aber beim double brauche ich es ja scheinbar nicht, oder ist das eh unsauber.
        Wie würdest du die Datentypen jeweilig initialisieren?

        Dass es nur beim float gefordert wird, ist in der Tat merkwürdig. Aber Java hält sich ja auch nicht an die Standards was Gleitkommazahlen angeht.
        Ich würde auch beim double die 1.0d Form verwenden. Allerdings ist es auch schon eine ganze Weile her, seit ich das letzte mal Java programmiert habe.

        mfG

        --
        sh:( fo:§ ch:{ rl:? br:> n4:# ie:} mo:? va:) de:µ zu:| fl:( ss:{ ls:~ js:)
        "And all those exclamation marks, you notice? Five? A sure sign of someone who wears his underpants on his head."
        (Terry Pratchett)
        1. Hi Benjamin,

          Ich würde auch beim double die 1.0d Form verwenden. Allerdings ist es auch schon eine ganze Weile her, seit ich das letzte mal Java programmiert habe.

          Ok, danke, ich denke ich kann mich damit abfinden, dass es einfach nicht ganz sauber ist und würde auch bei Double das d mit anfügen.

          ciao
          romy

        2. Tach.

          Dass es nur beim float gefordert wird, ist in der Tat merkwürdig. Aber Java hält sich ja auch nicht an die Standards was Gleitkommazahlen angeht.

          Das kann schon sein, da es nicht nur *den* Standard gibt, sondern mehrere -- falls man das dann noch Standard nennen kann.

          Care to elaborate?

          --
          Once is a mistake, twice is jazz.
          1. Hi!

            Das kann schon sein, da es nicht nur *den* Standard gibt, sondern mehrere -- falls man das dann noch Standard nennen kann.

            Care to elaborate?

            Here you are...

            http://de.wikipedia.org/wiki/Java-Syntax#Datentypen

            Die Java-Gleitkommatypen „float“ und „double“ halten mehrere wichtige Aspekte des IEEE 754-Standards nicht ein, insbesondere bei der Behandlung von Über- und Unterlauf und von NaNs; auch unterstützt Java nicht die sogenannten erweiterten Typen (single extended und double extended) des Standards.[1]

            [1]W. Kahan und Joseph D. Darcy: How Java’s Floating-Point Hurts Everyone Everywhere. ACM 1998 Workshop on Java for High–Performance Network Computing (http://www.cs.berkeley.edu/~wkahan/JAVAhurt.pdf)

            mfG

            --
            sh:( fo:§ ch:{ rl:? br:> n4:# ie:} mo:? va:) de:µ zu:| fl:( ss:{ ls:~ js:)
            "And all those exclamation marks, you notice? Five? A sure sign of someone who wears his underpants on his head."
            (Terry Pratchett)
  2. Tach.

    float blubber=1 ->zulässig
    float blubber=1.0 ->unzulässig, stattdessen gilt: float blubber=1.0f
    double blubber=1.0 ->zulässig

    Float und Double sind doch beides Fließkommazahlen, warum kann ich nicht beide damit initinalisieren? Ich hhabe nur die Aussage bekommen, dass es halt so ist, dass stellt mich nicht so richtig zufrieden ;)

    Java interpretiert Fließkommaliterale standardmäßig als Double. Das ist in die Sprache "eingebaut". Deswegen kannst du double d = 2.3 schreiben, aber nicht float f = 2.3. In letzterem Beispiel versuchst du nämlich, eine 64-Bit-Fließkommazahl (Double) in eine Variable zu stecken, die nur 32 Bit Platz bietet (Float). Deshalb mußt du mit dem zusätzlichen Suffix hantieren: float f = 2.3F;

    --
    Once is a mistake, twice is jazz.
    1. Hi Blaubart,

      Java interpretiert Fließkommaliterale standardmäßig als Double. Das ist in die Sprache "eingebaut". Deswegen kannst du double d = 2.3 schreiben, aber nicht float f = 2.3. In letzterem Beispiel versuchst du nämlich, eine 64-Bit-Fließkommazahl (Double) in eine Variable zu stecken, die nur 32 Bit Platz bietet (Float). Deshalb mußt du mit dem zusätzlichen Suffix hantieren: float f = 2.3F;

      Danke, das macht es noch etwas klarer.
      Mich wundert noch etwas.
      Ich habe auch gerade gelernt, dass ich ein Array an eine Methode übergeben kann und die Methode, sollte sie tatsächlich etwas verändern, das Original verändert. Das ist doch Mist. Wie verhindere ich denn dann das Manipulieren an Originalen?

      Beispiel:

        
       public static void ausgabefeld(int [] a){  
        for(int i=0; i<a.length; i++) {  
         System.out.println("Feld"+i+": " + a[i]);  
        }  
       }  
        
       public static void verdopplefeld(int [] a) {  
        for(int i=0; i<a.length; i++) {  
         a[i] *= 2;  
        }  
       }  
        
       public static void main(String[] args) {  
        int [] feld = {4,9,12};  
        // Ausgabe  
        
        // Hier verändert sich das Original, da ich das gesamte Objekt mitgegeben habe  
        // Call by Reference  
        verdopplefeld(feld);  
        ausgabefeld(feld);  
       }  
      
      

      Ich meine, dass verdopplefeld eigentlich nichts an feld verändern dürfte, so ist es jedenfalls in den mir bekannten Sprachen. Bei Strings und einfachen Datentypen macht java das nicht.

      ciao
      romy

      1. Tach.

        Ich habe auch gerade gelernt, dass ich ein Array an eine Methode übergeben kann und die Methode, sollte sie tatsächlich etwas verändern, das Original verändert. Das ist doch Mist.

        Eigentlich ist diese Art der Parameterübergabe gar nicht so dumm. Wenn lediglich der Zeiger auf den Parameter übergeben wird, muß nicht bei jedem Methodenaufruf "im Hintergrund" eine Kopie des Parameters erstellt werden. In Falle eines großen Arrays beispielsweise ein ziemlicher Gewinn. Java sagt statt dessen: Wenn du *wirklich* eine Kopie in der Methode brauchst, erstell sie dir selber.

        Wie verhindere ich denn dann das Manipulieren an Originalen?

        Indem du mit einer Kopie des Originals arbeitest.

        Bei Strings und einfachen Datentypen macht java das nicht.

        Richtig, die primitiven Typen werden "by value" übergeben. [1] Der Performancegewinn (s. o.) ist hier kein Argument für "call by reference", und außerdem ist das Arbeiten mit Kopien solcher Variablen in den Methoden wohl auch die häufigere und intuitivere Variante.

        [1] String müßte man hier eigentlich als Sonderform rausnehmen. Bei der Parameterübergabe teilt es aber das Verhalten der Primitiven.

        --
        Once is a mistake, twice is jazz.
        1. Hi Blaubart,

          Vielen Dank für die Ausführungen. Da werde ich mich umgewöhnen müssen ;) Sonst enstehen böse böse logische Fehler ;)

          ciao
          romy