2012-08-04 105 views

回答

5

您可以通過一個僅用於NaN的是真實的條件檢查楠:

bool isNan(float val) 
{ 
    return (val <= 0.0 || 0.0 <= val) ? false : true; 
} 

isinf是有點難度。沒有任何機制可以將浮點數轉換爲整型表示並使用這些位進行播放。所以你必須將它與一個適當的大數進行比較。

+0

謝謝!爲什麼這不是官方的規格?有沒有平臺,這不工作? – rsp1984 2012-08-05 11:14:54

+2

@RafaelSpring可能有。衆所周知,大多數GPU硬件都採用快捷鍵w.r.t.浮動導致__non -__符合IEEE 754的浮點數。因此,我懷疑你的所需行爲是有保證的。正如尼科爾所建議的那樣,您最好的選擇可能是對正常運營期間您預期的最低和最高價值有一個好的想法,並檢查您的價值是否在該範圍內。否則,它可能是'Inf'或'NaN'。 – 2012-12-13 01:18:26

+0

@SchighSchagh如果編譯器和/或GPU不符合IEEE-754標準,即使涉及NaN,即使比較運算符的結果也可能無法得到保證。我遇到過一種情況,如果一個參數是NaN,那麼一個寬鬆的編譯器會生成'<'的代碼,該代碼總是計算爲真。最安全的方法是防止NaN從頭生成。 – Sean 2014-05-14 17:56:35

2

WebGL的問題相同。 Nicol Bolas的答案適用於大多數GPU,但不適用於某些nVidias。這個版本的作品適合所有的GPU我有機會嘗試:

bool isNan(float val) 
{ 
    return (val < 0.0 || 0.0 < val || val == 0.0) ? false : true; 
    // important: some nVidias failed to cope with version below. 
    // Probably wrong optimization. 
    /*return (val <= 0.0 || 0.0 <= val) ? false : true;*/ 
} 
0

未經檢驗的,所以不知道這會工作(由於優化),但它應該工作,無論是天道酬勤和-Inf。

bool isinf(float val) { 
    return (val != 0.0 && val * 2.0 == val) ? true : false; 
    }