Я видел ответы здесь, и почти все хорошо. Тем не менее, я написал свою собственную версию, которая использует словарь для управления парами скобок и стек для мониторинга порядка обнаруженных скобок. Я также написал блог пост для этого.
Вот мой класс
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()
{
{'[', ']'},
{'(', ')'},
{'{', '}'}
};
}
}
при компиляции по умолчанию 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-битных, выбираемых с помощью флагов компиляции.
Хотя ссылка Тайдока на PiL 2.3 является правильным и подходящим, и ответ Хавьера на практике верен, я подумал, что обсуждение чисел в Lua следует дополнить парой других деталей.
Интерпретатор Lua предназначен для встраивания в приложение, как правило, в качестве языка конфигурации и / или языка сценариев. При создании приложения некоторые его функции обычно настраиваются в соответствии с требованиями.
Точный числовой тип, используемый для чисел, доступен для конфигурации. При компиляции для платформы без аппаратного обеспечения с плавающей запятой, когда загрузка сторонних модулей не важна (особенно во встроенной системе или приложении игровой консоли для телевизионных приставок), разумно выбрать интегральный тип вместо стандартного double
. Иногда целесообразно также переключаться на float
.
Однако есть приложения, в которых необходимы 64-битные целые числа, или большинство чисел могут быть целыми числами, но иногда требуется арифметика с плавающей запятой. Для этих случаев есть патч LNUM для ядра Lua.
LNUM изменяет ядро так, что числа хранятся либо как целые числа, либо как с плавающей запятой, и позволяет несколько настраиваемых вариантов выбора точности каждого.
Таким образом, основной ответ на вопрос о максимальном значении числа Lua состоит в том, что оно зависит от конфигурации интерпретатора, выбранного во время компиляции, и от того, беспокоитесь ли вы о максимальной представимой величине или максимальном целом числе. И даже тогда была проделана работа, чтобы большие целые числа хорошо работали с представлениями с плавающей запятой.
Я нашел это электронное письмо на сайте пользователей lua
Ядро Lua не использует 64-битные типы данных, за исключением неявных через
size_t
илиptrdiff_t
(которые оказываются 64-битными в 64-битном блоке).sizeof (float) == 4
sizeof (double) == 8Вы можете определить lua_Number как double (по умолчанию), float или любое целое число минимум 32 бита. Однако есть побочные эффекты и некоторые расширения может перестать работать из-за ограниченного набора float или int. Ядро хотя должно быть хорошо.