2008-12-02 31 views
4

我有雙(或浮點)變量,可能是「空」,因爲在沒有有效的價值。我如何用浮點型和雙精度型來表示這種情況?float或double特殊值

一個選項將是具有浮子和一個布爾值,但不可阻擋的工作,因爲我的庫具有存儲雙打和不是表現爲雙打對象容器的包裝。另一個將使用NaN(std :: numeric_limits)。但我沒有辦法檢查變量是否爲NaN。

我怎樣才能解決需要一個「特殊」的浮點值意味着比其他一些東西的問題?

回答

5

在Visual C++中,有一個非標準_isnan(double)函數,您可以通過float.h導入該函數。

在C,有一個isnan(double)的功能,可以通過進口math.h

在C++中,還有就是你可以通過cmath導入isnan(雙)功能。

正如其他人所指出的那樣,使用NaN的可不少麻煩。它們是一個必須像NULL指針一樣處理的特例。不同之處在於,NaN通常不會導致核心轉儲和應用程序故障,但它們非常難以追查。如果您決定使用NaN,儘可能少使用它們。過度使用NaN是一種令人反感的編碼習慣。

7

我們已經做了,通過使用楠:

double d = std::numeric_limits<double>::signaling_NaN(); 
bool isNaN = (d != d); 

NaN值相比,對自身平等將產生錯誤。這就是你測試NaN的方式,但它似乎只在std::numeric_limits<double>::is_iec559爲真時纔有效(如果是的話,它也符合ieee754)。

在C99中,在math.h中有一個名爲isnan的宏,它也檢查浮點數是否爲NaN值。

+0

」中可能還有一個。 http://www.parashift.com/c++-faq-lite/newbie.html#faq-29.15 – 2008-12-02 01:17:36

+0

感謝您的鏈接。他們正確地指出它的實施取決於它是否在其中。它可能會陷入困境,因爲在這些實現上間接包含math.h。 – 2008-12-02 01:23:34

+0

最好直接包含math.h恕我直言。無論如何,我還沒有發現任何關於d == d在標準NaN中是錯誤的,所以我認爲它是ieee754比C/C++更多的特性。如果我找到與該問題相關的任何內容,我會更新此答案。 – 2008-12-02 01:29:25

2

這不是一個內置的類型,但我通常使用boost::optional對於這種事情。如果你絕對不能使用它,那麼一個指針可能會做到這一點 - 如果指針爲NULL,那麼你知道結果不包含有效值。

1

其中一個選項是float ad和boolean類型的封裝,但無法工作,因爲我的庫具有用於存儲雙精度的容器,而不是表現爲雙精度的對象。

這是一個恥辱。在C++中,創建一個自動轉換爲實際雙引用屬性的模板類是很簡單的。 (或者是對於這個問題的任何其他類型的引用。)您只需在模板類中使用cast操作符。例如:運營商類型&(){返回值; }然後,您可以使用HasValue <雙>任何地方你通常使用雙。

另一個會使用NaN(std :: numeric_limits)。但我沒有辦法檢查變量是NaN。

由於litb詹姆斯Schek還表示,C99爲我們提供了isnan()。

但請注意!楠值讓數學&邏輯真正有趣!你會認爲一個數字不可能是不是> = foo而不是< = foo。但是用NaN,它可以。

我在我的工具箱中保留一個WARN-IF-NAN(X)宏是有原因的。過去我出現了一些有趣的問題。