Ich habe dieses Problem bei der Berechnung von 3 ** 557 in irb gefunden. Ruby und MacRuby sind beide auf meinem Mac installiert (OS X 10.8). Und die Version von Ruby ist 1.8.7, von MacRuby 0.12 (Rubin 1.9.2). Rippe und Macirb gaben mir zwei verschiedene Antworten auf die Berechnung von 3 ** 557. (Macirb ist richtig.)
%Vor%Und dann habe ich etwas Größeres versucht, z. 3 ** 5337, und ich bekam dieses Mal die gleiche Antwort.
Also, ist das ein Fehler in Ruby 1.8.7, oder sollte ich einen anderen Weg benutzen, um die Exponentiation zu berechnen?
Bei der Berechnung sollte Ruby von Fixnum nach Bignum konvertieren, wenn die Zahlen die Grenzen von Fixnum überschreiten. Bei älteren Versionen von Ruby schlägt dies mit dem Operator ** fehl:
%Vor%Wo es fehlschlägt hängt von der Wortgröße der Architektur ab. 64-Bit-Wörter auf dem iMac in diesem Beispiel. Intern wird die Fixnum in eine lange Ganzzahl umgewandelt, und der Operator wird mit Longs behandelt. Die Longs überlaufen die Wortgröße und Ruby behandelt dies ungemütlich, indem sie 0 zurückgibt.
Beachten Sie, dass der * Operator korrekt funktioniert (Konvertierung nach Bignum), wobei der ** fehlschlägt:
%Vor%Der Wechsel zu einer neueren Version von Ruby wird dies beheben. Wenn Sie nicht zu einer neueren Version wechseln können, vermeiden Sie Fixnum und ** mit großen Potenzen.
Die Verwendung von 1.9.3 liefert das korrekte Ergebnis. Wenn Sie keinen wirklich guten Grund haben, versuchen Sie 1.9.3 oder besser zu verwenden, da 1.8.7 ausläuft.
Es ist auch erwähnenswert, dass ich nach dem Testen mit 1.8.7-p358 unter Linux auch die richtige Antwort bekomme. Es könnte ein Fehler in der von Ihnen verwendeten Version 1.8.7 sein.
Das ist definitiv ein Fehler. Es hängt wahrscheinlich von den Prozessor- und / oder Kompilierungsoptionen ab.
Ich wäre nicht überrascht, wenn es von diesem Commit behoben würde.
Wie andere gesagt haben, machen nur Sicherheitsfixes es heutzutage zu 1.8.7, also upgrade auf 1.9.3.
Es ist nicht explizit mit der Exponentiation verbunden. Ich denke, es hängt irgendwie mit dem Übergang von 63 zu 64 Bits zusammen, die für die Darstellung benötigt werden, obwohl dies nicht 100% ig konsistent erscheint.
%Vor%und
%Vor%noch
%Vor% Außerdem: Ich lief irb im 32-Bit-Modus ( arch -i386 irb
), ich sehe das nicht an dieser Stelle, aber früher:
Das Schreiben Ihrer eigenen Potenzierungsmethode scheint eine andere Art zu sein, dies zu tun, die keine Fehler erzeugt:
%Vor% '10 'für jede Potenz sollte mit einer einzelnen' 1 'beginnen und nur von Nullen gefolgt sein.
Rubys **
Funktion:
Benutzerdefiniert xpnt
Methode:
Tags und Links ruby bignum exponential