2009-07-18 13 views

Antwort

7

Ja, siehe die Struktur.

0

Das BigInt-Äquivalent heißt LargeInt. Siehe these lecture notes, um einige Funktionen zur Konvertierung zwischen int (aka Int) und LargeInt zu sehen.

+1

Aus der SML-Basisbibliothek: "Wenn eine Implementierung die IntInf-Struktur bereitstellt, muss" LargeInt "die gleiche Struktur wie" IntInf "(angezeigt durch eine ausdünnende" INTEGER "-Signatur) haben, andernfalls" LargeInt " ist nicht das gleiche wie 'Int', dann muss eine Struktur' Int 'gleich' LargeInt' sein. " Mit anderen Worten, 'LargeInt' ist nicht garantiert unbegrenzt (obwohl SML/NJ's), aber es ist portabler als' IntInf' (das nicht existieren muss). – ephemient

+1

Ich rate von LargeInt ab. Sie haben lieber einen Kompilierungsfehler als einen unerwarteten Überlauf zur Laufzeit. (Obwohl das Auslaufen von Erinnerungen einen ganz eigenen Reiz hat.) –

-2

Nun, Int setzt eine scheußliche Grenze für Dinge wie die Berechnung von Permutationen. SML benötigt einen großen numerischen Datentyp, der natürlicher zu verwenden ist.

4

Der offizielle SML'97 Standard basis library stellt einen Zoo von Strukturen wie Int, IntInf, Int32, Int64, LargeInt usw.

Um sich tatsächlich in der Praxis nutzen, um die Dinge funktionieren wie erwartet, und sie effizient funktionieren , müssen Sie sich die zur Verfügung stehende SML-Implementierung genau anschauen.

  • Eine Familie von Implementierungen imitiert das Speicherlayout von C und Java, so Int32 wirklich ein 32-Bit-Maschine Wort sein wird (aber mit Überlaufprüfung) und Int64 ein 64-Bit-Maschine Wort. SML/NJ ist ein bemerkenswertes Beispiel dafür, und seine kleine Int-Arithmetik ist schnell, aber ihre große int-Arithmetik ist langsam.

  • Eine andere Familie von Implementierungen stammt aus dem Hintergrund der symbolischen Berechnung (LISP oder Computer Algebra), wo Poly/ML ein bemerkenswertes Beispiel ist. Hier haben Sie standardmäßig Int = IntInf = LargeInt, und die Implementierung verwendet zuerst (teilweise) das native Maschinenwort als Approximation, bis es überläuft und dann zu wirklich großen Ganzzahlen wechselt, die auf dem Heap zugewiesen sind (als umrahmte Werte). Poly/ML verwendet die GNU MP-Bibliothek für diesen großen Teil.

So Int/IntInf ist sehr effizient, solange Ihre Anwendung zu ganzen Zahlen ist, nicht in der Maschine Worte einer bestimmten Größe: Int32 im symbolischen Modell wird nicht in ein einziges Wort auf 32-Bit-Hardware passen aufgrund der zusätzliche Tag-Bits, die benötigt werden. Einige Algorithmen, die sich tatsächlich mit der Wortarithmetik beschäftigen, werden sich verschlechtern, zum Beispiel SHA1 auf 32-Bit-Hardware. Das implizite Upgrade von "kürzen-als-Worte" int in Heap-allokierte große int gibt Ihnen etwas Besseres als BigInt in Java, weil Sie nicht den gesamten Objekt-Overhead für kleine Werte benötigen: 42 wird sei nur ein Bit-Muster in einem Register (mit zusätzlichem Tag-Bit), aber keine schwere Box auf dem Heap.

0

Obwohl dies nicht genau das ist, was Sie gefragt haben, möchten Sie eigentlich kein Äquivalent zur Java BigInt-Klasse. Javas BigInt-Klasse implementiert O (n^2) Zeit für die Multiplikation (im Wesentlichen Multiplikation der Art, wie es in der Grundschule gelehrt wird), anstelle von O (n log n), was möglich ist. Dies ist sehr wichtig, da eine Menge trivialer BigInt-Programmierung einfach nicht mit der n^2-Version funktioniert.