Suche C# Bibliothek für Berechnungen mit Zahlen beliebiger Genauigkeit

Hallo!

Ich suche für C# eine Bibliothek um mit Zahlen mit beliebiger Genauigkeit rechnen zu können (für fraktale Berechnungen).

DIe Bibliothek muss folgendes können:

  • Dezimalzahlen mit beliebiger Genauiglkeit (>1000 Nachkommastellen)
  • Operationen: +, -, *, /
  • potenzieren, auch Kommazahlen, wäre schön: auch mit negativen Zahlen
  • Wurzelfunktion (wäre schön, geht aber sonst mit potenzieren)
  • Logarithmus (Basis e, ev: 2, 10, wäre schön: beliebige Basis)
  • sollte möglichst schnell sein

Ich hab zwar schon ein bischen gegooglet, aber bisher nichts brauchbares gefunden.

Kennt jemand so eine Bibliothek?

Danke im Voraus!

Wozu brauchst du da eine Bibliothek? Mit dem richtigen datentypen klappt das schon.

Aber du hast ein grundsätzliches Denkproblem, wie man an der Fragestellung gut sieht. Es gibt keine beliebige Genauigkeit. Selbst Zahlen mit einer Nachkommastelle lassen sich nicht 100% genau in Binärzahlen umwandeln.

Beispiel:

0.1 wird als 64-bit-Zahl 0.10000000149011612 gespeichert und folglich wird auch damit gerechnet. Das liegt einfach an der Rechenmethode von dezimal zu binär und ist prinzipbedingt nicht korrigierbar.

Hier mal zum Spielen: http://www.h-schmidt.net/FloatConverter/IEEE754de.html

Was du also brauchst sind Datentypen mit möglichst hoher Breite, um Rundungsfehler auf ein Minimum zu reduzieren.

Das breiteste was C# so aus dem Stand kann ist decimal mit 128bit.

Damit kannst du dann auch deine gewünschten Operationen machen:

Hallo!

Danke erst mal für deine Antwort.
Ein Denkproblem hab ich nicht, und die Fragestellung ist finde ich auch klar.
Es gibt z.B. in PHP das Paket „BC Math“ (http://at2.php.net/manual/en/function.bcadd.php). Damit kann man man mit Zahlen belibiger Genauigkeir rechnen. Wenn ich z.B. sage ich möchte 5000 Nachkommastellen haben dann bekomme ich exakte Zahlen mit 5000 Nachkommastellen. Der Unterschied zu den „normalen“ Datentypen ist der, dass hier mit Strings „gerechnet“ wird, deshalb sind die Zahlen auch exakt.
Den Typ Decimal kenn ich schon, aber der ist auch noch viel zu „klein“. Es gibt doch sicher C# Programme die mit Zahlen jenseits der Standatdtypen arbeiten, vermutlich im wissenschaftlichen Bereich zu finden.

Ich denke mal, dass es soetwas schon gibt, aber meine Suche war bisher erfolglos.

Hm. Aber sowas kann man sich doch leicht selbst zusammenstricken.

Beispiel Addition:

  1. nimm die beiden Zahlen und teile sie jeweils am Dezimaltrenner
  2. addiere Zahlen VOR dem Dezimaltrenner als Integer
  3. prüfe, welche der Zahlen NACH dem Dezimaltrenner kürzer ist und fülle die am Ende mit Nullen auf, bis beide gleich lang sind
  4. addiere die gleich langen Zahlen NACH dem Dezimaltrenner als Integer
  5. Setze beide Ergebnisse wieder mit Dezimaltrenner zusammen

Für sowas brauchst du doch keine Bibliothek, sowas kann man selbst stricken. Aber schnell wird das sicher nicht.

Ja, selber bauen geht natürlich, aber ich werde nicht damit anfangen ohne zu schauen ob es soetwas bereits gibt, ist ja viel Arbeit.
Falls es vergleichbares nicht gibt werde ich es selbst bauen müssen. Es wird nur etwas dauern bis ich alle Operationen / Funktionen, wie in der Frage beschrieben, implementiert habe. Dass das ganze natürlich nicht schnell ist ist mir durchaus bewusst da es sich um Strings handelt.
Ich werde noch etwas weiter suchen und nebenbei schonmal damit anfangen.

Ich möchte ergänzen (auch wenn das eigentlich klar sein müsste), dass hier natürlich darauf geachtet werden muss, dass der Übertrag beachtet wird.

Ich kenne mich zwar mit C# überhaupt nicht aus, habe mich aber schon mal vor dreißig Jahren mit dem Problem beschäftigt. Ich glaube, ich habe in einem Seminar eine ADA-Datentypklasse definiert, mit der man lineare Gleichungssysteme ohne Rundungsprobleme lösen konnte, in dem die Zahl als Rationalzahl in Form eines Strings implementiert war.

Inzwischen gibt es für viele Hochsprachen solche Bibliotheken, um große Integer, Rationalzahlen oder Dezimalzahlen zu bearbeiten.

Guckst Du hier:

Um so etwas sinnvoll einsetzen zu können, benötigt man - wie so oft beim professionellen Programmieren - das Verständnis der dahinterstehenden Technik und Mathematik.

Von daher halt ich von BigInteger- und BigRational-Bibliotheken viel und von BigDecimals wenig. Ich würde sogar die ketzerische These aufstellen, dass es BigDecimals gibt, weil der Wunsch danach so groß ist, allein durch die Verwendung einer Bibliothek zur Lösung zu kommen, ohne sich um die Grundlage kümmern zu müssen.

Gleitkommaarithmetik und Genauigkeit sind so wie Kaffeepulver und Expresso.

Zudem dürften Deine Vorstellungen bzgl. der Operatoren utopisch sein.

Bei den einfachen arithmetischen Funktionen können BigInteger- und BigRational ihre Stärken ausspielen. Weil das Ergebnis unabhängig von den Eingangswerten im Wertebereich der Datentypen bleibt.

Gleitkommaarithmetik ist schon bei den Grundrechenarten pseudogenau und muss heuristisch arbeiten, um die richtige Rundung zu „erraten“.

Mathematische Funktionen wie Logarithmieren und Potenzieren (außer Trivialpotenzen) dürfte kaum irgendwo mit beliebiger Genauigkeit verfügbar sein, weil die Mathe-Bibliotheken solche Werte über Näherungsformeln implementieren, die auf den klassischen Elementartypen (double) abgestimmt sind. Die hängen in der Regel auch zusammen.

Ciao, Allesquatsch

Hallo!

BigInter kenn ich, jedoch kann diese Klasse, wie der Name schon sagt, nur Integerwerte verarbeiten.
BigDecimal hätte ich in Visual Studio 2015 installiert, jedoch kann ich die Klasse nicht finden. Auch mit Google hab ich auf die Schnelle nichts gefunden.

Ich habe jetzt selbst angefangen eine eigene Klasse zu schreiben, aber leider hab ich nicht so viel Zeit. Addition, Subtraktion und Multiplikation hab ich schon, Division kommt als nächstes. Die Exponentialfunktion (für a^b), Logarithmus etc. Baue ich mittels der Näherungssummen zusammen. Aber dies dauert noch etwas (Zeitmangel).

LG

Wenn du nett bist, kannst du das ja dann auf github oder sourceforge oder sonstwo veröffentlichen, damit die Welt was von deinen Ergebnissen hat.

Wenn es fehlerlos läuft werde das sicher eine gute Idee…

Nach langer Zeit endlich fertig: