web-dev-qa-db-de.com

Gibt es eine Math API für Pow (dezimal, dezimal)

Gibt es eine Bibliothek für die Dezimalberechnung, insbesondere die Methode Pow(decimal, decimal)? Ich kann keine finden.

Es kann kostenlos oder kommerziell sein, solange es eine gibt.

Hinweis: Ich kann es nicht selbst machen, kann keine Schleifen verwenden, kann Math.Pow, Math.Exp oder Math.Log nicht verwenden, da alle doubles verwenden und doubles nicht verwendet werden können. Ich kann eine Serie nicht verwenden, weil sie so genau wie doubles wäre.

31
Maxime ARNSTAMM

Einer der Multiplikatoren ist eine Rate: 1/Rate ^ (Tage/365). 

Der Grund, warum es keine dezimale Potenzfunktion gibt, liegt darin, dass es sinnlos wäre, decimal für diese Berechnung zu verwenden. Verwenden Sie double

Denken Sie daran, dass der Punkt der Dezimalstelle ist, um sicherzustellen, dass Sie eine exakte Arithmetik für Werte erhalten, die genau als kurze Dezimalzahlen dargestellt werden können. Für vernünftige Werte von rate und days sind die Werte aller anderen Unterausdrücke eindeutig nicht und werden genau als kurze Dezimalwerte dargestellt. Sie werden es mit ungenauen Werten zu tun haben. Verwenden Sie daher einen Typ, der für schnelle Berechnungen leicht ungenauer Werte wie double ausgelegt ist.

Wenn die Ergebnisse im Doppel berechnet werden, werden sie auf die eine oder andere Weise um einige Milliardstel eines Pennys abfallen. Wen interessiert das? Sie werden den Fehler später abrunden . Führen Sie die Ratenberechnung im Doppel aus. Wenn Sie ein Ergebnis haben, das erneut in eine Währung umgewandelt werden muss, multiplizieren Sie das Ergebnis mit Zehntausend. Runden Sie es auf die nächste Ganzzahl ab, konvertieren Sie das Ergebnis in eine Dezimalzahl, und teilen Sie es erneut durch Zehntausend auf. Ich habe ein Ergebnis, das auf vier Dezimalstellen genau ist, was für eine Finanzberechnung ausreichend sein sollte.

45
Eric Lippert

Hier ist was ich verwendet habe. 

output = (decimal)Math.Pow((double)var1, (double)var2);

Jetzt lerne ich nur, aber das hat funktioniert, aber ich weiß nicht, ob ich es richtig erklären kann. 

ich glaube, dass dies die Eingabe von var1 und var2 übernimmt und sie als Argument für die math.pow-Methode verdoppelt. Danach muss (dezimal) vor math.pow der Wert auf eine Dezimalzahl zurückgesetzt werden und der Wert in die Ausgangsvariable eingefügt werden. 

Ich hoffe, jemand kann mich korrigieren, wenn meine Untersuchung falsch ist, aber ich weiß nur, dass es für mich funktioniert hat. 

7
Andrew

Nun, hier ist die Wikipedia-Seite, auf der die aktuellen C # -Numerikbibliotheken aufgeführt sind. Aber TBH Ich glaube nicht, dass Dezimalzahlen viel Unterstützung finden 

http://en.wikipedia.org/wiki/List_of_numerical_libraries

Es ist unangemessen, im Allgemeinen Dezimalzahlen für diese Art von Berechnung zu verwenden. Ja, es ist hochpräzise - aber es ist auch eine geringe Reichweite. Wie aus den MSDN-Dokumenten hervorgeht, handelt es sich um finanzielle/monetäre Berechnungen - wo POW leider nicht viel verlangt wird!

Natürlich kann es sein, dass Sie eine bestimmte Problemdomäne haben, die eine extrem hohe Genauigkeit erfordert, und alle Zahlen liegen zwischen 10 (28) und 10 (-28). In diesem Fall müssen Sie jedoch wahrscheinlich nur Ihren eigenen Reihenrechner schreiben, wie z. B. den in den Kommentaren zu der Frage verknüpften.

2
James Gaunt

decimal nicht verwenden. Verwenden Sie stattdessen double. Gemäß diesem Thread wird Math.Pow (double, double) direkt von CLR aufgerufen.

Wie wird Math.Pow () in .NET Framework implementiert?

Folgendes hat .NET Framework 4 (nur 2 Zeilen)

[SecuritySafeCritical]
public static extern double Pow(double x, double y);

64-Bit-Dezimalzahlen sind in dieser 32-Bit-CLR noch nicht nativ. Vielleicht in Zukunft auf 64-Bit-Frameworks?

0
Jeson Martajaya