Стратегии параллельной реализации чисел Lua и 64-битного целого - PullRequest
2 голосов
/ 26 июня 2011

Lua по умолчанию использует тип с плавающей запятой двойной точности (double) в качестве единственного числового типа.Это мило и полезно.Тем не менее, я работаю над программным обеспечением, которое ожидает увидеть 64-битные целые числа, для которых я не могу использовать фактические 64-битные целые так или иначе.

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

Какие стратегии вы можете порекомендовать при использовании 64-битного целогопечатать параллельно с числовым типом Lua по умолчанию?Я действительно не хочу выбрасывать реализацию по умолчанию за борт (и я не беспокоюсь о ее производительности по сравнению с целочисленной арифметикой), но мне нужен какой-то способ представления 64-битных целых чисел с полной точностью без слишком большого снижения производительности.

Моя проблема в том, что я не уверен, где изменить поведение.Должен ли я изменить синтаксис и расширить синтаксический анализатор (на ум приходят числа с добавленным LL или ULL, который, насколько мне известно, не существует в Lua по умолчанию), или я должен вместо этого написать свой собственный модуль C и определить тип пользовательских данных, который представляет 64-битную версиюцелое число вместе с библиотечными функциями, способными манипулировать значениями?...

Примечание: да, я встраиваю Lua, так что я могу свободно расширять его, как мне угодно.

Ответы [ 3 ]

3 голосов
/ 26 июня 2011

Как часть порта LuaJIT для процессоров ARM (которые часто имеют плохую плавающую точку), LuaJIT внедрил «виртуальную машину с двойным числом», которая позволяет динамически переключаться между целыми числами и числами с плавающей запятой по мере необходимости. Вы можете использовать это самостоятельно, просто переключаясь между 64-битными целыми и двойными числами вместо 32-битных целых чисел и чисел с плавающей запятой.

В настоящее время он находится в сборках, поэтому вы можете рассмотреть возможность использования LuaJIT в качестве Lua-интерпретатора. Или вы можете использовать это как способ научиться делать подобные вещи.

Однако я согласен с Марсело; 53-битной мантиссы должно быть много. Вы не должны действительно нуждаться в это в течение хороших 10 лет или около того.

2 голосов
/ 02 июля 2011

Если вам не понадобится точность с плавающей точкой в ​​какой-либо точке программы, вы можете просто переопределить LUA_NUMBER до __int64 (или любой 64-битный тип int, который может быть в вашей среде) в luaconf.h .

В противном случае вы можете просто ввести другую библиотеку для обработки ваших целых чисел - для бесконечной точности вы можете использовать библиотеку bignum, такую ​​как lhf's lbn.

2 голосов
/ 26 июня 2011

Я бы посоветовал хранить ваши данные за пределами Lua и использовать какой-либо тип ссылки для их получения при вызове ваших других библиотек. Затем вы можете поместить различные результаты в стек Lua для пользователя, чтобы увидеть, вы можете даже получить значение в виде строки, чтобы быть точным, но я бы не стал изменять их в Lua и полагаться на значения Lua при вызове вашей внешней библиотеки.

...