Эрланг длинный 64 номер БУГ - PullRequest
0 голосов
/ 19 августа 2010

Эрланг усекает значение больших длинных операций, если один из операндов недостаточно велик. Хотя это не усекает, если оба операнда достаточно велики.

199> 3656626623097354252900000 * 11111111111111111111111111. 
40629184701081713921111110704819264100293971900000
200> 3656626623097354252900000 * 64.                     
234024103878230672185600000

Любая подсказка, почему? Или это действительно ошибка?

Ответы [ 2 ]

3 голосов
/ 19 августа 2010

Только что попробовал обе операции, используя GHCI (интерпретатор Glasgow Haskell), и он дал точно такой же результат.

Не уверен, если вы знаете об этом, но Эрланг поддерживает bignums :

В информатике, арифметика произвольной точности является техника, в соответствии с которой расчеты выполняется на номера, чьи цифры Точность ограничена только доступная память хост-системы. Это контрастирует с тем быстрее арифметика с фиксированной точностью найдена в большинство оборудования ALU, которое обычно предлагает от 6 до 16 десятичных цифры. Это также называется bignum арифметика, а иногда даже "арифметика с бесконечной точностью" (которая является неправильным, так как число цифры конечны и ограничены в практика).

2 голосов
/ 25 августа 2010

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

Эти целые числа реализованы с использованием так называемых "fixnum" и "bignum". Фиксированные числа - это (целые) целые числа, соответствующие 28 битам в 32-битной архитектуре или 60 битам в 64-битной архитектуре. Дополнительные биты используются для маркировки типов (помните, что Erlang динамически строго типизирован и, следовательно, нуждается в тегах типа для своих значений). Виртуальная машина Erlang затем переключается на bignum выше этого размера. Это гораздо менее эффективно реализовано.

Добавьте компиляцию HiPE поверх того, чтобы оставаться в пределах диапазона фиксированных значений, и вы должны иметь «скорость, близкую к C» для арифметических частей программы.

...