BigInt для Стандартного ML / NJ - PullRequest
4 голосов
/ 18 июля 2009

Существует ли эквивалент Java BigInt для Standard ML? Обычный тип int генерирует исключение при переполнении.

Ответы [ 5 ]

7 голосов
/ 18 июля 2009

Да, см. Структуру IntInf .

5 голосов
/ 01 марта 2013

Официальный стандарт SML'97 базовая библиотека представляет целый ряд структур, таких как Int, IntInf, Int32, Int64, LargeInt и т. Д.

Чтобы реально использовать их на практике, чтобы заставить вещи работать так, как ожидалось, и чтобы они работали эффективно, вам нужно внимательно посмотреть на реализацию SML.

  • Одно семейство реализаций имитирует структуру памяти C и Java, поэтому Int32 будет действительно 32-битным машинным словом (но с проверкой переполнения), а Int64 - 64-битным машинным словом. SML / NJ является ярким примером для этого, и его маленькая внутренняя арифметика быстрая, но большая внутренняя арифметическая медленная.

  • Другое семейство реализаций происходит из опыта символьных вычислений (LISP или Компьютерная алгебра), где Poly / ML является ярким примером. Здесь у вас есть Int = IntInf = LargeInt по умолчанию, и реализация сначала использует (часть) машинное слово в качестве приближения, пока оно не переполнится, а затем переключается на действительно большие целые числа, которые выделяются в куче (в виде значений в штучной упаковке). Poly / ML использует библиотеку GNU MP для этой большой части.

Таким образом, Int / IntInf очень эффективен, если ваше приложение имеет целые числа, а не машинные слова определенного размера: Int32 в символьной модели не поместится в одно слово на 32-битном оборудовании из-за дополнительных битов тега, которые являются обязательными. Так что некоторые алгоритмы, которые на самом деле об арифметике слов, будут ухудшаться, например, SHA1 на 32-битном оборудовании.

С другой стороны, неявное обновление меньшего размера слова int до выделенного в куче большого int дает вам нечто лучшее, чем BigInt в Java, потому что вам не понадобятся полные издержки объекта для небольших значений: 42 будет просто какой-то битовый шаблон в регистре (с дополнительным битом тега), но не тяжелый блок в куче.

0 голосов
/ 27 июля 2015

Хотя это не совсем то, о чем вы просили, на самом деле вам не нужен эквивалент класса Java BigInt. Класс Java BigInt реализует O (n ^ 2) время для умножения (по сути, умножения, как это преподается в начальной школе), вместо O (n log n), что возможно. Это действительно важно, так как многие тривиальные программы BigInt просто не работают с версией n ^ 2.

0 голосов
/ 18 сентября 2009

Что ж, int накладывает неприятное ограничение на такие вещи, как вычисление перестановок. SML нужен большой числовой тип данных, более естественный для использования.

0 голосов
/ 18 июля 2009

BigInt-эквивалент называется LargeInt. См. эти примечания к лекции , чтобы увидеть некоторые функции о том, как конвертировать между int (иначе Int) и LargeInt.

...