2013-10-01 26 views
6

Я довольно новичок в Lua. Во время тестирования я обнаружил #INF/#IND. Однако я не могу найти хорошую ссылку, которая объясняет это.В Lua, что такое #INF и #IND?

Что такое #INF, #IND и т. Д. (Например, негативы) и как их создавать и использовать?

+1

'1/0',' -1/0 'и' 0/0 ' –

+0

Ваш Lua сборки необходимо использовать тип с плавающей точкой для 'типа number' Lua в , (Строка Lua по умолчанию использует тип C 'double'.) См. [Что каждый компьютерный ученый должен знать о арифметике с плавающей точкой] (http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg .html) Дэвида Голдберга. –

ответ

7

#INF бесконечно, #IND - NaN. Дайте ему испытание:

print(1/0) 
print(0/0) 

Выход на моей машине Windows:

1.#INF 
-1.#IND 

Поскольку нет стандартного представления для них в ANSI C, вы можете получить другой результат. Например:

inf 
-nan 
+1

'-1. # IND' - это конкретный шаблон NaN, известный как' INDEFINITE'. Битовая диаграмма для версии с двойной точностью - '0xfff800000000000'. – njuffa

6

Расширение @YuHao уже хороший ответ.

Lua мало что делает при преобразовании числа в строку, поскольку он в значительной степени зависит от реализации библиотеки C. Фактически Lua print implementation вызывает Lua tostring, который в свою очередь (после серии других вызовов) использует lua_number2str macro, который определяется в терминах C sprintf. Таким образом, в конце вы видите любое представление для бесконечностей и NaNs, которые использует реализация C (это может варьироваться в зависимости от того, какой компилятор использовался для компиляции Lua и с какой C-средой связано ваше приложение).

2

@YuHao уже указал, что означает +/- 1. # INF (+ -inf) и -1. # IND (nan), поэтому я просто добавлю, как с этим бороться (что мне просто нужно было) в Lua:

  • "инф" (+/- 1. # INF), тем выше число значений, что (Луа/с) может представлять и язык предусматривает, что константа для вас: "math.huge". Таким образом, вы можете протестировать число внутри Lua для + -INF; функция «isINF()» ниже показывает, как ее использовать.
  • «nan» (- 1. # IND) - это то, что нельзя обрабатывать численно: оно должно быть числом, его нет, и все, что вы делаете с ним, - это что угодно, кроме числа. имея в виду, что ни один NaN не равен другим NaN; проверьте для NaN, как функция «isNAN()» ниже.

local function isINF(value) 
    return value == math.huge or value == -math.huge 
end 

local function isNAN(value) 
    return value ~= value 
end 

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