2013-10-01 19 views
6

Jestem całkiem nowy w Lua. Podczas testów odkryłem #INF/#IND. Jednak nie mogę znaleźć dobrego odniesienia, które to wyjaśnia.W Lua, co to jest #INF i #IND?

Co to są #INF, #IND i podobne (takie jak negatywy) i jak je generujesz i wykorzystujesz?

+1

'1/0',' -1/0' i '0/0' –

+0

Twój build Lua musi używać typ zmiennoprzecinkową dla Lua' typu number' . (Domyślna kompilacja Lua używa typu C "double".) Zobacz [Co każdy informatyk powinien wiedzieć o arytmetyki zmiennoprzecinkowej] (http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg .html) David Goldberg. –

Odpowiedz

7

#INF jest nieskończona, #IND jest NaN. Daj mu Test:

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

Wyjście na moim komputerze z systemem Windows:

1.#INF 
-1.#IND 

Ponieważ nie ma standardowe przedstawienie dla nich w ANSI C, można uzyskać różne rezultaty. Na przykład:

inf 
-nan 
+1

'-1. # IND' to szczególny wzór NaN znany jako" INDEFINITE ". Wzorem bitowym dla wersji o podwójnej precyzji jest '0xfff800000000000'. – njuffa

6

Poszerzenie @YuHao już jest dobrą odpowiedzią.

Lua robi mało, gdy konwertuje liczbę na ciąg znaków, ponieważ w dużej mierze opiera się na implementacji biblioteki C. W rzeczywistości Lua print implementation dzwoni do Lua tostring, która z kolei (po serii innych połączeń) używa numeru lua_number2str macro, który jest zdefiniowany jako C sprintf. Tak więc na końcu widać jakąkolwiek reprezentację nieskończoności i NaN, z których korzysta implementacja C (może się to różnić w zależności od tego, który kompilator został użyty do kompilacji Lua i do którego środowiska wykonawczego C jest połączona twoja aplikacja).

2

@YuHao już wskazał, co oznacza +/- 1. # INF (+ -inf) i -1. # IND (nan), więc dodam tylko jak sobie z tym poradzić (co po prostu musiałem) w Lua:

  • "inf" (+/- 1. # INF) są wartościami im wyższa liczba, że ​​(Lua/C) może reprezentować, a język stanowi, że stała dla Ciebie: "math.huge". Możesz przetestować numer wewnątrz Lua dla + -INF; funkcja "isINF()" poniżej pokazuje, jak z niej korzystać.
  • "nan" (- 1. # IND) jest czymś, co nie może być obsługiwane numerycznie: powinno być liczbą, nie jest, a wszystko, co robisz z nią, nie jest niczym innym jak liczbą. mając to na uwadze pamiętajmy, że żadne NaN nie jest równe innym NaN; sprawdź NaN podobnie jak funkcję "isNAN()" poniżej.

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

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