2013-10-01 10 views
6

Sono abbastanza nuovo per Lua. Durante i test ho scoperto #INF/#IND. Tuttavia, non riesco a trovare un buon riferimento che lo spieghi.In Lua, cosa sono #INF e #IND?

Cosa sono #INF, #IND e simili (ad esempio negativi) e come vengono generati e utilizzati?

+1

'1/0 ',' -1/0' e '0/0 ' –

+0

tuo Lua costruzione deve essere utilizzando un tipo in virgola mobile per' tipo number' di Lua . (La build Lua predefinita usa il tipo C 'double'.) Vedi [Cosa ogni scienziato informatico dovrebbe sapere sull'aritmetica virgola mobile] (http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg .html) di David Goldberg. –

risposta

7

#INF è infinito, #IND è NaN. Dategli una prova:

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

uscita sulla mia macchina Windows:

1.#INF 
-1.#IND 

Poiché non c'è rappresentazione standard per questi in ANSI C, è possibile ottenere risultati diversi. Ad esempio:

inf 
-nan 
+1

'-1. # IND' è un particolare pattern NaN noto come 'INDEFINITE'. Il modello di bit per la versione a doppia precisione è '0xfff800000000000'. – njuffa

6

Espansione @YuHao già buona risposta.

Lua fa poco quando si converte un numero in una stringa, poiché dipende in gran parte dall'implementazione della libreria C sottostante. Infatti Lua print implementation chiama Lua che a sua volta (dopo una serie di altre chiamate) utilizza lo lua_number2str macro, che è definito in termini di C sprintf. Così alla fine si vede qualsiasi rappresentazione per infiniti e NaN che l'implementazione C usa (questo può variare a seconda di quale compilatore è stato usato per compilare Lua e a quale runtime C è collegata la tua applicazione).

2

@YuHao ha già indicato cosa significa +/- 1. # INF (+ -inf) e -1. # IND (nan), quindi aggiungerò semplicemente come gestirlo (di cui avevo solo bisogno) in Lua:

  • "inf" (+/- 1. # INF) sono il numero più alto dei valori che (Lua/C) può rappresentare e la lingua che prevede costante per voi: "math.huge". Quindi puoi testare un numero all'interno di Lua per + -INF; la funzione "isINF()" qui sotto mostra come usarlo.
  • "nan" (- 1. # IND) è qualcosa che non può essere gestito numericamente: dovrebbe essere un numero, non è, e qualsiasi cosa tu faccia con esso è tutto tranne un numero. ricordando che nessun NaN è uguale ad altri NaN; controlla NaN come la funzione "isNAN()" sotto.

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

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