2010-12-15 2 views
5

Perl уже давно является моим языком сценариев выбора, но я столкнулся с ужасной проблемой. По умолчанию нет поддержки длинных (64-разрядных) целых чисел. В большинстве случаев целое число является просто строкой, и они работают для поиска в огромных файлах, но есть много мест, где они не работают, например, двоичные &, printf, pack, unpack, <<, >>.Какие языки сценариев поддерживают длинные (64-битные) целые числа?

Теперь они работают в новых версиях Perl, но только если они построены с поддержкой 64-разрядных целых чисел, что не помогает, если я хочу сделать переносимый код для запуска на Perls, построенный без этой опции. И вы не всегда получаете контроль над Perl в системе, в которой работает ваш код.

Мой вопрос заключается в том, что Python, PHP и Ruby страдают от такой проблемы, или они также зависят от вариантов версии и сборки?

+7

Из любопытства, любая причина, по которой используется bigint; недостаточно? – Hugmeir 2010-12-15 16:24:53

+0

@ Hugmeir: Просто, что это медленно. Я обрабатываю файлы дампа MediaWiki, размер которых может быть несколько терабайт! – hippietrail 2010-12-15 16:39:21

+1

@hippietrail, вы уверены, что виноваты 64-битные номера? – 2010-12-15 21:15:32

ответ

14

Размер высокоскоростных аппаратных целых чисел (при условии, что язык имеет их) всегда будет зависеть от любых целых чисел, доступных для компилятора, который скомпилировал интерпретатор языка (обычно C).

Если вам нужна поддержка кросс-платформенной/кросс-версии большого целого, Perl pragma use bigint; сделает трюк. Если вам нужно больше контроля, bigint является оберткой вокруг модуля Math::BigInt.

В области, где загружается use bigint;, все целые числа в этой области будут прозрачно обновлены до Math::BigInt. Наконец, при использовании любого типа библиотеки большого числа, не забудьте использовать трюки, такие как 9**9**9, чтобы получить бесконечность, потому что вы можете ждать некоторое время :)

1

Извините, сэр, bigint и Math::BigInt являются частью основных модулей. Just friggin 'use один из них, он будет работать на любой платформе.

2

Многоцелевая поддержка Tcl 8.5's очень хороша с точки зрения пользователя. Внутри он представляет целые числа, поскольку любой тип необходим для их хранения (вплоть до и в том числе bigints), и все, что потребляет целые числа, возьмет любой из них (хотя может налагать свои ограничения, вы действительно не хотите использовать число, которое будет только вписывается в bigint как в режиме Unix-файла ...)

Единственный раз, когда вам действительно нужно об этом думать, это когда вы собираетесь в/из двоичного формата фиксированной ширины. Это достаточно очевидно, хотя (в конце концов, это фиксированная ширина).

3

В Python вы никогда не получите переполнения. Вместо этого python переключает реализацию чисел, которые он использует автоматически. Основная реализация использует встроенные ints на платформе, но длинные целые числа используют бесконечную длину. В результате вам никогда не придется беспокоиться о том, что ваши цифры становятся слишком большими, python просто справляется с этим.

Смежные вопросы