Как я могу распечатать огромное количество в Lua, не используя экспоненциальное представление?

Вам не нужна необработанная производительность от операции, которую Вы будете выполнять чрезвычайно нечасто с точки зрения ЦП.

11
задан zslayton 15 July 2009 в 20:02
поделиться

2 ответа

> print(string.format("%18.0f",1247687475123456))

1247687475123456

16
ответ дан 3 December 2019 в 04:33
поделиться

Lua, как обычно настроен, использует обычный для вашей платформы формат с плавающей запятой двойной точности для хранения всех чисел. Для большинства настольных платформ сегодня это будет 64-битный формат IEEE-754. Общепринятое мнение состоит в том, что целые числа в диапазоне от -1E15 до + 1E15 можно безопасно считать представленными точно.

В любом случае, функция string.format () проходит аргументы (с некоторыми незначительными изменениями) в платформенную реализацию printf () . Строка формата, распознаваемая функцией printf () , включает % e и % E , чтобы заставить «научную» нотацию, и % f , чтобы заставить простая десятичная запись. Кроме того, % g и % G выбирают кратчайшее обозначение.

Например:

E:\...>lua
Lua 5.1.4  Copyright (C) 1994-2008 Lua.org, PUC-Rio
> a = 1e17/3
> print(string.format("%f",a))
33333333333333332.000000
> print(string.format("%e",a))
3.333333e+016
> print(string.format("%.0f",a))
33333333333333332

Обратите внимание, что если значение помещается в диапазон 32-битных целых чисел со знаком, вы также можете использовать формат % d . Однако результаты не будут четко определены, если значение превышает этот диапазон. Системные отметки времени в микросекундах, вероятно, превысят 32-битный диапазон.

Если 16 десятичных цифр недостаточно точны, есть несколько вариантов, доступных для повышения точности.

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

Во-вторых, один из авторов Lua выпустил два модуля, поддерживающих арифметику произвольной точности: lbc и lmapm .

8
ответ дан 3 December 2019 в 04:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: