7 Stimmen

Typen für große Zahlen

Ich arbeite an einer Anwendung, die sehr große Zahlen verarbeiten muss.

Ich habe mir ein paar verfügbare LargeNumber-Klassen angesehen und einige gefunden, mit denen ich zufrieden bin. Ich habe eine Klasse für große Ganzzahlen und für große Fließkommazahlen.

Da einige der Zahlen klein und einige große die Frage ist, ob es sich lohnt, die Länge der Zahl zu überprüfen und wenn es klein ist, verwenden Sie eine reguläre C# int oder double und wenn es groß ist, verwenden Sie die anderen Klassen, die ich habe, oder wenn ich bereits mit der Large Integer und Large Float Klassen sollte ich nur mit ihnen auch für kleinere Zahlen bleiben.

Meine Überlegung ist rein leistungsbezogen. Kann ich bei den kleineren Zahlen so viel Zeit bei der Berechnung einsparen, dass es sich lohnt, jede Zahl zu überprüfen, nachdem sie eingegeben wurde?

2voto

cwap Punkte 10738

Wirklich schwer zu sagen - hängt von Ihren 3rd-Party-Bibliotheken ab :)

Am besten wäre es, die Klasse System.Diagnostics.StopWatch zu verwenden, eine Unmenge verschiedener Berechnungen durchzuführen, sie zu timen und die Ergebnisse zu vergleichen, denke ich.

[EDIT] - Über die Benchmarks, würde ich eine Reihe von Benchmarks Ihre largeInt-Typ, um die Berechnungen auf regulären 32/64-Bit-Zahlen zu tun, und eine Reihe überprüfen, ob die Zahl in den regulären Int32/Int64-Typen passen kann (was sie sollten), "downcasting" sie zu diesen Typen, und führen Sie dann die gleichen Berechnungen mit diesen Typen. Von Ihrer Frage, das klingt wie das, was Sie tun werden, wenn die eingebauten Typen schneller sind.

Wenn Ihre Anwendung für mehrere Personen bestimmt ist, versuchen Sie, sie auf verschiedenen Rechnern laufen zu lassen (Single-Core-, Multicore-, 32bit-, 64bit-Plattformen), und wenn die Plattform einen großen Einfluss auf die Berechnungszeit zu haben scheint, verwenden Sie eine Art Strategie-Muster, um die Berechnungen auf verschiedenen Rechnern unterschiedlich durchzuführen.

Viel Glück :)

2voto

shoosh Punkte 73374

Ich würde erwarten, dass eine anständige Bibliothek für große Zahlen in der Lage wäre, diese Optimierung selbst durchzuführen...

2voto

Hosam Aly Punkte 40063

Ich würde sagen, ja, der Scheck wird sich mehr als bezahlt machen, solange Sie genügend Werte innerhalb des regulären Bereichs haben.

Die Logik ist einfach: Eine Ganzzahladdition ist ein Assemblerbefehl. Kombiniert mit einem Vergleich sind das drei oder vier Befehle. Jede Software-Implementierung eines solchen Vorgangs wird höchstwahrscheinlich viel langsamer sein.

Optimalerweise sollte diese Prüfung in den LargeNumber-Bibliotheken selbst durchgeführt werden. Wenn sie es nicht tun, brauchen Sie vielleicht einen Wrapper, um zu vermeiden, dass überall Prüfungen stattfinden. Aber dann muss man auch an die zusätzlichen Kosten des Wrappers denken.

0voto

Kb. Punkte 6960

Ich habe an einem Projekt gearbeitet, bei dem dieselben Felder sehr große Zahlen verarbeiten und gleichzeitig die Präzision für sehr kleine Zahlen handhaben mussten.
Das endete damit, dass für jede Zahl dieser Art zwei Felder (Mantisse und Exponent) gespeichert wurden.
Wir haben eine Klasse für Mantissen-/Exponentenberechnungen erstellt, die gut funktioniert.

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