Каково максимальное значение числа в Lua?

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

Вот мой класс

public class FormulaValidator
{
    // Question: Check if a string is balanced. Every opening bracket is matched by a closing bracket in a correct position.
    // { [ ( } ] )

    // Example: "()" is balanced
    // Example: "{ ]" is not balanced.
    // Examples: "()[]{}" is balanced.
    // "{([])}" is balanced
    // "{ ( [ ) ] }" is _not_ balanced

    // Input: string, containing the bracket symbols only
    // Output: true or false
    public bool IsBalanced(string input)
    {
        var brackets = BuildBracketMap();
        var openingBraces = new Stack();
        var inputCharacters = input.ToCharArray();

        foreach (char character in inputCharacters)
        {
            if (brackets.ContainsKey(character))
            {
                openingBraces.Push(character);
            }

            if (brackets.ContainsValue(character))
            {
                var closingBracket = character;
                var openingBracket = brackets.FirstOrDefault(x => x.Value == closingBracket).Key;

                if (openingBraces.Peek() == openingBracket)
                    openingBraces.Pop();
                else
                    return false;
            }
        }

        return openingBraces.Count == 0;
    }

    private Dictionary BuildBracketMap()
    {
        return new Dictionary()
        {
            {'[', ']'},
            {'(', ')'},
            {'{', '}'}
        };
    }
}

21
задан Kai 3 June 2009 в 16:31
поделиться

3 ответа

при компиляции по умолчанию Number - это double , в большинстве компиляторов это 64-битная плавающая точка IEEE. это означает 10-битную экспоненту, поэтому максимальное число составляет примерно 2 ^ 1024, или 5,6e300 лет. это очень долго.

теперь, если вы увеличиваете его, вас может больше интересовать целочисленный диапазон. 52-битная мантисса означает, что максимальное число, которое может быть использовано с целочисленной точностью, равно 2 ^ 52, около 4,5e15. 31'557 600 секунд в год, это 1,427e8, почти 150 миллионов лет. все еще очень долгое время безотказной работы для любого процесса.

Обновление 2014-12-30 : Lua 5.3 (который будет выпущен в любой момент) добавляет поддержку целочисленных значений, 32- или 64-битных, выбираемых с помощью флагов компиляции.

27
ответ дан 29 November 2019 в 20:55
поделиться

Хотя ссылка Тайдока на PiL 2.3 является правильным и подходящим, и ответ Хавьера на практике верен, я подумал, что обсуждение чисел в Lua следует дополнить парой других деталей.

Интерпретатор Lua предназначен для встраивания в приложение, как правило, в качестве языка конфигурации и / или языка сценариев. При создании приложения некоторые его функции обычно настраиваются в соответствии с требованиями.

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

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

LNUM изменяет ядро ​​так, что числа хранятся либо как целые числа, либо как с плавающей запятой, и позволяет несколько настраиваемых вариантов выбора точности каждого.

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

8
ответ дан 29 November 2019 в 20:55
поделиться

Я нашел это электронное письмо на сайте пользователей lua

Ядро Lua не использует 64-битные типы данных, за исключением неявных через size_t или ptrdiff_t (которые оказываются 64-битными в 64-битном блоке).

sizeof (float) == 4
sizeof (double) == 8

Вы можете определить lua_Number как double (по умолчанию), float или любое целое число минимум 32 бита. Однако есть побочные эффекты и некоторые расширения может перестать работать из-за ограниченного набора float или int. Ядро хотя должно быть хорошо.

0
ответ дан 29 November 2019 в 20:55
поделиться
Другие вопросы по тегам:

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