Unerwartete Ergebnisse
confused
- javascript
Hallo,
ist folgendes irgendwo dokumentiert?:
a = Math.pow(2,64);
b = a - 1;
a > b => false
a - b => 0
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
Hi,
ist folgendes irgendwo dokumentiert?:
a = Math.pow(2,64);
b = a - 1;a > b => false
a - b => 0Ja. 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.
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
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
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.
Hallo,
Es ist
2^64 = 18446744073709551616
2^64 - 1 = 18446744073709551615In JS aber
2^64 = 18446744073709552000
2^64 - 1 = 18446744073709552000Anschaulich: 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
Nachtrag: JS als ungeeignet abgehakt. Das Gefrickel mit BigNumber etc. muss ich mir nicht antun.