4 Stimmen

Bin ich verrückt oder ist Math.Pow kaputt?

Ich habe den Basis-Konverter von hier und änderte es, um mit ulong-Werten zu arbeiten, aber bei der Konvertierung von großen Zahlen, insbesondere Zahlen höher als 16677181699666568 wurde es falsche Werte zurückgegeben. Ich begann, dies zu untersuchen und entdeckte, dass Math.Pow(3, 34) den Wert 16677181699666568 zurückgibt, obwohl 3^34 eigentlich 16677181699666569 ist. Das macht mir also einen Strich durch die Rechnung. Ich nehme an, dass dies nur ein Problem mit der doppelten Genauigkeit innerhalb der Pow-Methode ist? Ist es am einfachsten, eine eigene Pow-Methode zu erstellen, die ulong-Werte akzeptiert?

Wenn ja, wie kann ich Pow am schnellsten erreichen? Ich nehme an, es gibt etwas Schnelleres als eine for-Schleife mit Multiplikation jedes Mal.

7voto

Yuriy Faktorovich Punkte 64670

Sie können verwenden BigInteger.Pow . Oder verwenden Sie meine Power-Methode für long .

6voto

Jon Skeet Punkte 1325502

Das Problem ist, dass Math.Pow gibt eine double und die nächstgelegene double Wert zu 16677181699666569 ist 16677181699666568.

Ohne sich also Math.Pow beteiligt:

long accurate = 16677181699666569;
double closestDouble = accurate;
// See http://pobox.com/~skeet/csharp/DoubleConverter.cs
Console.WriteLine(DoubleConverter.ToExactString(closestDouble));

Das druckt 16677181699666568.

Mit anderen Worten was auch immer Math.Pow tut intern kann es kein Ergebnis liefern, das genauer ist als das, das Sie erhalten.

Wie andere gesagt haben, BigInteger.Pow ist Ihr Freund, wenn Sie .NET 4 verwenden.

5voto

Richard Punkte 103159

Lesen Sie _Was jeder Informatiker über Fließkommazahlen wissen sollte_

Fließkommatypen sind eine Annäherung, die Rundung, die Sie sehen, ist normal.

Wenn Sie genaue Ergebnisse wünschen, verwenden Sie BigInteger .

1voto

ysth Punkte 91645

Ich nehme an, dies ist nur ein Problem mit doppelter Genauigkeit innerhalb der Pow Methode?

Ja.

Am einfachsten ist es, wenn ich die eigenes Pow zu erstellen, das ulong-Werte annimmt?

Sie können BigInteger.Pow verwenden.

0voto

Tejs Punkte 39916

Wenn Sie .NET Framework 4 verwenden, hat Microsoft eine neue BigInteger-Klasse integriert, mit der Sie große Zahlen bearbeiten können.

http://msdn.microsoft.com/en-us/library/system.numerics.biginteger.aspx

Alternativ können Sie auch eine schöne Bibliothek verwenden, die jemand anderes erstellt hat:

http://intx.codeplex.com/ (IntX-Bibliothek)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X