2009-03-01 19 views
7

Ich arbeite an einer App, die sehr große Zahlen verarbeiten muss.Typen für große Zahlen

Ich habe ein paar verfügbare LargeNumber-Klassen ausgecheckt und ein paar gefunden, mit denen ich zufrieden bin. Ich habe eine Klasse für große Ganzzahlen und für große Gleitkommazahlen.

Da einige der Zahlen klein und einige groß sind, ist die Frage, ob es sich lohnt, die Länge der Zahl zu überprüfen, und wenn es klein ist, verwenden Sie ein normales C# int oder double und wenn es groß ist, verwenden Sie die anderen Klassen I habe oder wenn ich bereits die Large Integer und Large Float Klassen verwende, sollte ich einfach bei ihnen bleiben, auch für kleinere Zahlen.

Meine Überlegung ist reine Leistung. Werde ich genügend Zeit, auf die Mathematik für die kleineren Zahlen speichern, dass es sich lohnen würde jede Zahl nachdem es in gesetzt, um zu prüfen

+0

Welche Klassen verwenden Sie für größere Zahlen? – ahsteele

+0

Ich spiele mit ein paar. Microsoft.FSharp.Math.BigInt Microsoft.SolverFoundation.Common.BigInteger http://www.codeproject.com/csharp/biginteger.asp IntX für Dezimalzahlen Ich bin mit w3b.sine Microsoft.FSharp.Math.BigNum Ich werde einige Benchmarks auf allen von ihnen zu tun und sehen, was ich – Sruly

+0

erhalten Bitte sehen Sie diese [Frage] (http: //stackoverflow.com/questions/494923/numbers-that-exceeds-basic-types-in-c). –

Antwort

2

wirklich schwer zu sagen -. Hängt von 3rd-Party-Bibliotheken :)

Beste Wette wäre es, die System.Diagnostics.StopWatch Klasse zu verwenden, eine gazzillion verschiedene Berechnungen zu machen, sie zu zeihen und die Ergebnisse zu vergleichen, denke ich ..

[EDIT] - Über die Benchmarks würde ich eine Reihe von Benchmarks machen largeInt-type, um die Berechnungen für reguläre 32/64 Bit-Nummern durchzuführen, und eine Reihe, die prüft, ob die Zahl in die regulären Int32/Int64-Typen passen kann (was sie tun sollten), sie auf diese Typen reduzieren und dann dasselbe ausführen berechnen lationen mit diesen Typen. Von Ihrer Frage klingt das wie, was Sie tun werden, wenn die eingebauten Typen schneller sind.

Wenn Ihre Anwendung auf mehr Leute als Sie selbst ausgerichtet ist, versuchen Sie, sie auf verschiedenen Maschinen auszuführen (Single Core, Multicore , 32-Bit-, 64-Bit-Plattformen), und wenn die Plattform einen großen Einfluss auf die Zeit hat, die die Berechnungen benötigen, verwenden Sie eine Art von Strategie-Pattern, um die Berechnungen auf verschiedenen Rechnern unterschiedlich durchzuführen.

Viel Glück :)

+0

Welche Art von Benchmarktests würden Sie durchführen? – Sruly

+0

@Sruly - diejenigen, die die Art von Mathematik duplizieren, die Ihre Anwendung benötigt; -p –

+0

Aktualisierte ursprüngliche Antwort mit benchmark-spezifischen Sachen: P – cwap

2

ich, dass eine anständige große Zahl Bibliothek wäre in der Lage erwarten würden diese Optimierung zu tun, auf seine eigene ...

2

Ich würde sagen, ja, die Prüfung wird mehr als bezahlen selbst, solange Sie genügend Werte im normalen Bereich haben.

Die Logik ist einfach: Eine Ganzzahl Addition ist eine Assembly-Anweisung. Kombiniert mit einem Vergleich sind das drei oder vier Anweisungen. Jede Software-Implementierung einer solchen Operation wird höchstwahrscheinlich viel langsamer sein.

Optimal sollte diese Überprüfung in den LargeNumber-Bibliotheken selbst durchgeführt werden. Wenn sie es nicht tun, benötigen Sie möglicherweise einen Wrapper, um zu vermeiden, überall Kontrollen zu haben. Aber dann müssen Sie auch an die zusätzlichen Kosten des Wrappers denken.

0

Arbeitete in einem Projekt, wo die gleichen Felder sehr große Zahlen und gleichzeitig Handelsgenauigkeit für sehr kleine Zahlen benötigt.
Die endete mit dem Speichern von Feldern (Mantisse und Exponent) für jede Zahl dieser Art.
Wir haben eine Klasse für Mantissen/Exponenten-Berechnungen erstellt und es hat sich gut entwickelt.