2013-10-01 53 views
6

我對Lua相當陌生。在測試過程中,我發現#INF/#IND。但是,我找不到解釋它的好參考。在Lua中,#INF和#IND是什麼?

什麼是#INF,#IND和類似(如否定)以及如何生成和使用它們?

+1

'1/0','-1/0'和'0/0' –

+0

你的Lua構建必須使用Lua的'number'型浮點型。 (默認的Lua構建使用C'double'型)。參見[什麼每臺計算機科學家應該知道關於浮點運算(http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg .html)David Goldberg。 –

回答

7

#INF是無限的,#IND是NaN。給它一個測試:我的Windows機器上

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

輸出:

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來定義。因此,最後你會看到C實現使用的無窮無盡和NaN的表示(這可能因編譯Lua時使用的編譯器和應用程序鏈接的C運行時而異)。

2

@YuHao已經指出了什麼手段+/- 1#INF(+ -INF)和-1。#IND(男),所以我只是補充如何處理它(我只需要)在Lua:

  • 「inf」(+/- 1.#INF)是(Lua/C)可以表示的較高數值,並且語言爲您提供了常數:「math.huge」。所以你可以在Lua裏爲+ -INF測試一個數字;下面的函數「isINF()」顯示瞭如何使用它。
  • 「南」( - 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