2010-08-19 2 views
-1

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

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

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

+5

Оба эти результата верны. Я не уверен, где вы думаете, проблема в вашем примере. – Welbog

+3

Какие результаты вы ожидаете? Я не вижу ничего плохого в том, что вы опубликовали. – Gabe

ответ

3

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

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

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

+0

Большое количество не должно быть необходимо для 64-битного длинного номера. Я строю высокоэффективную систему, где бонусы резко уменьшат скорость системы. – Thiago

+1

Извините, что сообщите об этом вам, но если у вас высокая производительность системы в зависимости от числовых вычислений, Erlang не лучший язык для выбора, если вы не переместите функции на C с NIF (http://www.erlang.org/ док/человек/erl_nif.html) –

2

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

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

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

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