confused: Unerwartete Ergebnisse

Hallo,

ist folgendes irgendwo dokumentiert?:

a = Math.pow(2,64);
b = a - 1;

a  >  b => false
a  -  b => 0

  1. Hi,

    ist folgendes irgendwo dokumentiert?:

    a = Math.pow(2,64);
    b = a - 1;

    a  >  b => false
    a  -  b => 0

    Ja. Es nennt sich systemimmanente Ungenauigkeit der Darstellung großer Zahlen als Float.

    MfG ChrisB

    --
    RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
    1. Hi,

      ist folgendes irgendwo dokumentiert?:

      a = Math.pow(2,64);
      b = a - 1;

      a  >  b => false
      a  -  b => 0

      Ja. Es nennt sich systemimmanente Ungenauigkeit der Darstellung großer Zahlen als Float.

      Dann ist das System ungeignet und sollte ausgetauscht werden.
      Bei x^y dermassen falsche Ergebnisse zu liefern ist schlicht lächerlich.
      Selbst die primitivsten Taschenrechner machen das besser.

      1. Tach,

        Dann ist das System ungeignet und sollte ausgetauscht werden.

        vielleicht sollte eher der User des Systems sich dessen Grenzen bewusst sein.

        Bei x^y dermassen falsche Ergebnisse zu liefern ist schlicht lächerlich.

        [latex]2^{64} \approx 1.84467440737096 * 10^{19}[/latex], der Fehler bei der Subtraktion von 1 ist also minimal.

        Selbst die primitivsten Taschenrechner machen das besser.

        Das ist Unsinn, primitive Taschenrechner bieten selten mehr als 10 oder 11 Stellen Genauigkeit (meist etwa eine mehr als aufs Display geht.)

        mfg
        Woodfighter

      2. Hi,

        Bei x^y dermassen falsche Ergebnisse zu liefern ist schlicht lächerlich.
        Selbst die primitivsten Taschenrechner machen das besser.

        ich kann mich erinnern, dass mein Schullehrer das Beispiel 2^x+1-2^x==0 (für große x) mal explizit gezeigt hat als Beispiel dafür, dass Taschenrechner nicht genau rechnen.

        Bis die Tage,
        Matti

  2. a = Math.pow(2,64);
    b = a - 1;

    a  >  b => false
    a  -  b => 0

    Es ist
    2^64     = 18446744073709551616
    2^64 - 1 = 18446744073709551615

    In JS aber
    2^64     = 18446744073709552000
    2^64 - 1 = 18446744073709552000

    Anschaulich: Jenseits von 2^53 = 9007199254740992 gibt es keine exakte Integer-Arithmetik mehr, nur noch Rundungsfehler-behaftete Float-Arithmetik. Für mehr Einzelheiten siehe ECMA 8.5 Number Type

    Gruß H.

    1. Hallo,

      Es ist
      2^64     = 18446744073709551616
      2^64 - 1 = 18446744073709551615

      In JS aber
      2^64     = 18446744073709552000
      2^64 - 1 = 18446744073709552000

      Anschaulich: Jenseits von 2^53 = 9007199254740992 gibt es keine exakte Integer-Arithmetik mehr, nur noch Rundungsfehler-behaftete Float-Arithmetik.

      das ist auch kein Wunder, weil im IEEE-Format "Double Precision Floating Point" (Datentyp double in C) von den insgesamt 64bit gerade 52 für die Mantisse verwendet werden. Von den übrigen 12 ist eines das Vorzeichen, und die restlichen 11 der Exponent (einschließlich seines Vorzeichens).

      Würde man nur das Single-Precision-Format verwenden (float oder single in C), dann hätte man denselben Effekt schon ab 2^24 (ungefähr 16M). Dieses Format benutzt 32bit, davon 23 für die Mantisse, 1 fürs Vorzeichen und 8 für den Exponenten.

      Ciao,
       Martin

      --
      Du kannst dem Leben nicht mehr Tage geben.
      Aber dem Tag mehr Leben.
      Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
  3. Nachtrag: JS als ungeeignet abgehakt. Das Gefrickel mit BigNumber etc. muss ich mir nicht antun.