2016-10-07 45 views
1

我的理解是,NaN(不是數字)是essentaly從數學函數返回的常量,表示出錯或計算無效。因此,它們是檢測數字是否爲NaN或更好的函數是合理的,使用CERT編碼標準對數學錯誤進行錯誤檢查(https://www.securecoding.cert.org/confluence/display/c/FLP32-C.+Prevent+or+detect+domain+and+range+errors+in+math+functions)。C++爲什麼要將某些東西轉換成NaN?

我的問題是這樣的;爲什麼std :: nan()存在?爲什麼你會想要一個有效的數字/字符串/值並將其轉換爲NaN? (Refrence:http://en.cppreference.com/w/cpp/numeric/math/nan

+3

完整性與標準。 NaN可以有不同的值。可能有必要爲測試代碼創建特定的NaN,以便進行比較。甚至有必要在運行時檢測特定的NaN。 – davidbak

+0

這是否意味着存在一系列代表特定錯誤的NaN常量? – Katianie

+0

我不確定,但我懷疑有這樣的NaN常量的_standard_集合。但是你的特定CPU /協處理器/數學庫可能有文檔來指示它可能返回的某些特定值... – davidbak

回答

1

假設你想實現std :: acos。如果輸入無效(| arg | < 1),你將如何返回nan?應該可以在C++中實現這些功能。除此之外,您可能需要編寫一個不由STL提供的函數,C++的獨特圖表之一是它的標準庫可以用C++編寫。

+0

這是我如何實現ACOS: \t如果(islessequal(-1,numInRadians)==真&& islessequal(numInRadians,1)==真) \t { \t \t返回acos(numInRadians); \t} \t return -1.0; – Katianie

+0

@Katianie假設你沒有'acos'函數來調用。 – erip

+0

好點,如果我的住所有一個acos電話。 但是因爲我在這種情況下做的,對於我的其他數學函數,我使用CERT標準的相同方式檢查輪詢和域錯誤(請參閱我的問題中的鏈接)。這樣,我從來沒有真正接觸過NaN值。 – Katianie

2

NaN通常用於表示空值或缺失值,特別是在數據分析和數據科學中。因此,應用程序將值初始化爲nan是很常見的,以便跟蹤是否提供了值,而沒有使用類似optional<T>結構的開銷。

其次,它通常創建自定義數學函數,您希望返回某些輸入nan。所以它不僅僅是爲了完整。

+0

所以你可以使用NaNs進行帶內錯誤信號?出於好奇,你有沒有任何示例庫的文檔,我可以看看這樣做? – davidbak

+0

Numpy和熊貓是一個很好的例子:http://pandas.pydata.org/pandas-docs/stable/missing_data.html – Inverse

+0

接下來,在這裏推薦nans的理由是,你可以像往常一樣繼續計算nans (如在大向量運算中),nan值自然會傳播到最終結果,並且只會影響到值。 – Inverse

1

IEEE 754系統地引入了使用NaN來表示數字,否則其定義可能無法在計算機上表示。

你會經常看到這個爲0/0,±inf /±inf,0 *±inf等。

+0

但是在那裏爲那些域外結果定義了(在標準中)不同的NaNs嗎? – davidbak

+0

查看此鏈接:https://www.securecoding.cert.org/confluence/display/c/FLP32-C.+Prevent+or+detect+domain+and+range+errors+in+math+functions我跟着它關於如何檢查輪詢和域錯誤。 – Katianie

+0

@davidbak按標準我假設你的意思是IEEE標準。在754年,有關NaN的一些有趣的含義。特別是NaN中唯一被定義爲真的操作是'NaN!= NaN',所以沒有兩個NaN是相同的。 – erip

相關問題