Ich versuche darüber nachzudenken, wie ich mit extrem großen Zahlen rechnen würde (bis unendlich - keine Fließkommazahlen), wenn das Sprachkonstrukt keine Zahlen verarbeiten kann, die größer als ein bestimmter Wert sind.
Ich bin sicher, dass ich nicht der Erste oder der Letzte bin, der diese Frage stellt, aber die Suchbegriffe, die ich verwende, geben mir keinen Algorithmus, um mit diesen Situationen umzugehen. Eher bieten die meisten Vorschläge einen Sprach- oder Variablenwechsel an oder sprechen über Dinge, die für meine Suche irrelevant erscheinen. Also brauche ich eine kleine Anleitung.
Ich würde einen Algorithmus wie diesen skizzieren:
Bestimmen Sie die maximale Länge der Ganzzahlvariablen für die Sprache.
Wenn eine Zahl länger als die Hälfte der maximalen Länge der Variablen ist, wird sie in einem Array aufgeteilt. (Gib ein kleines Spielzimmer)
Array-Reihenfolge [0] = die Zahlen ganz rechts [n-max] = die Zahlen ganz links
Ex. Num: 29392023 Array [0]: 23, Array [1]: 20, Array [2]: 39, Array [3]: 29
Da ich die halbe Länge der Variablen als Markierungspunkt festgelegt habe, kann ich dann die Einsen, Zehntel, Hundertstel usw. berechnen. Platzieren Sie die Variable über die Zwischenmarke, sodass ich das weiß, wenn die maximale Länge einer Variablen 10 Stellen von 0 bis 9999999999 beträgt Indem ich das auf fünf Ziffern halbiere, bekomme ich etwas Spielraum.
Wenn ich also addiere oder multipliziere, kann ich eine variable Prüffunktion haben, die feststellt, dass die sechste Stelle (von rechts) von Array [0] mit der ersten Stelle (von rechts) von Array [1] identisch ist.
Teilen und Subtrahieren haben ihre eigenen Probleme, über die ich noch nicht nachgedacht habe.
Ich würde gerne wissen, welche Implementierungen für die Unterstützung größerer Zahlen am besten geeignet sind als das Programm.
quelle
Antworten:
Sie suchen eine Arithmetikbibliothek mit willkürlicher Genauigkeit (auch "multiple precision" oder "big num" genannt) für die Sprache, mit der Sie arbeiten. Wenn Sie zum Beispiel mit C arbeiten, können Sie die GNU Bignum Library verwenden -> http://gmplib.org/
Wenn Sie verstehen möchten, wie es funktioniert, können Sie auch Ihre eigene Big Num-Bibliothek schreiben und diese verwenden. Am einfachsten geht das mit Arrays, bei denen jedes Element eine Ziffer der Zahl ist, mit der Sie arbeiten. Danach müssen Sie alle Funktionen implementieren, um zu addieren, zu subtrahieren, zu multiplizieren, zu dividieren, zu potenzieren und so weiter.
quelle
Es ist ein bekanntes Problem: Arithmetik mit beliebiger Genauigkeit
Wenn die von Ihnen verwendete Sprache dieses Problem nicht behebt, suchen Sie zunächst eine Drittanbieter-Bibliothek, die dies tut. Wenn Sie es nicht finden oder neugierig sind, versuchen Sie es umzusetzen. Der Wikipedia-Artikel enthält gute Verweise auf klassische Implementierungen.
quelle
Im Umgang mit großen Zahlen ist wahrscheinlich eine der grundlegendsten Entwurfsentscheidungen, wie ich die große Zahl darstellen werde.
Handelt es sich um eine Zeichenfolge, ein Array, eine Liste oder eine benutzerdefinierte (hausgemachte) Speicherklasse?
Nachdem diese Entscheidung getroffen wurde, können die tatsächlichen mathematischen Operationen in kleinere Teile zerlegt und dann mit Muttersprachentypen wie int oder integer ausgeführt werden.
Ich habe ein sehr rudimentäres ADDITION-Beispiel in C # .Net eingefügt, in dem die resultierende große Zahl als Zeichenfolge gespeichert wird. Eingehende "Zahlen" sind ebenfalls Zeichenfolgen, daher sollte man in der Lage sein, sehr "große" Zahlen einzusenden. Denken Sie daran, dass das Beispiel nur für ganze Zahlen gedacht ist, um es einfach zu halten.
Auch bei Strings gibt es eine Begrenzung der Anzahl von Zeichen oder "Zahlen" in der Anzahl, wie hier angegeben:
Was ist die maximal mögliche Länge eines .NET-Strings?
Sie können jedoch einige wirklich große Zahlen hinzufügen, die weit über die nativen Typen int32 oder int64 für .Net hinausgehen.
Wie auch immer, hier ist eine String-Speicherimplementierung.
Ich hoffe, das gibt Ihnen einige Anregungen für Ihre eigene Implementierung. Bitte beachten Sie, dass der Beispielcode wahrscheinlich nicht optimiert ist. Es soll einige Ideen geben, wie es getan werden könnte.
quelle
Dieser arbeitet bei mir schneller:
quelle