2013-09-11 6 views
0

Я использую 32-разрядную Linux-машину и использую TCL 8.5. когда я хочу вычислить более 4 байтовых целых чисел, я получаю ошибку. Но я могу сделать то же самое, используя пакет «Mpexpr». Я сомневаюсь, что размер моей шины данных составляет 32 бит, но когда я установил пакет Mpexpr, я могу обрабатывать 8 байтовых целых чисел, как работает Mpexpr и как 32-битная шина данных внезапно увеличилась до 64 бит. Я хочу знать, как работают внутренние вещи.TCL: Что касается команды Mpexpr и expr

% set tcl_platform(wordSize) 

4 

% 

ответ

0

Я думаю, вы можете быть немного смущены. Tcl 8.5 внутренне использует свою собственную арифметическую библиотеку произвольной точности (вилка libtommath), и она всегда должна вести себя так, как если бы целые были бесконечной ширины; фактическое представление обменивается взад и вперед между C long, long long и реальным типом произвольной точности по мере необходимости (хорошо, потому что использование родных числовых типов намного быстрее). Вы никогда не сможете писать сценарий, который соблюдает разницу, отличную от использования явных «отливок» функций Tcl int() и wide().

Было гораздо более вероятно, что вы заметите проблему, которую вы описываете при использовании Tcl 8.4 (или раньше), где не было встроенной арифметической поддержки произвольной точности, и вам пришлось использовать пакет mpexpr.

Что касается того, как все работает, это в основном связано с тем, что значения в Tcl не должны быть представлены как системные целые числа; существует много других возможных представлений. Например, можно использовать long long, а это 64-битное целое число в обычных 32-битных системах. Для более крупных типов представление обычно представляет собой последовательность «цифр», где каждая «цифра» находится в диапазоне 0-255; арифметические операции затем следуют общепринятым правилам для длительного сложения, длительного умножения и т. д., так же как и в школах. За исключением более десяти цифр для рассмотрения. (Действительно, они могут использовать C unsigned short вместо unsigned char для каждой цифры, давая диапазон 0-65535.) Существует довольно много специализированных алгоритмов, которые позволяют вам выполнять более сложные операции довольно быстро; Я дам вам ваши собственные литературные поиски ...

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