簡體   English   中英

浮動或雙重特殊值

[英]Float or Double Special Value

我有雙(或浮點)變量,可能是“空”,如沒有有效值。 如何使用內置類型float和double來表示這種情況?

一個選項是一個包含浮點數和布爾值的包裝器,但這不起作用,因為我的庫有容器存儲雙精度而不是表現為雙精度的對象。 另一個是使用NaN(std :: numeric_limits)。 但我認為無法檢查變量是否為NaN。

如何解決需要“特殊”浮點值來表示數字以外的其他問題?

我們通過使用NaN做到了這一點:

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值的浮點數。

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

在C中,有一個isnan(double)函數可以通過math.h導入。

在C ++中,有一個isnan(double)函數可以通過cmath導入。

正如其他人所指出的那樣,使用NaN可能會帶來很多麻煩。 它們是一種特殊情況,必須像NULL指針一樣處理。 不同之處在於NaN通常不會導致核心轉儲和應用程序故障,但它們很難追蹤。 如果您決定使用NaN,請盡可能少地使用它們。 過度使用NaN是一種冒犯性的編碼習慣。

它不是內置類型,但我通常使用boost::optional這種事情。 如果你絕對不能使用它,也許指針就可以了 - 如果指針是NULL,那么你知道結果不包含有效值。

一個選項是一個包含浮動廣告布爾值的包裝器,但這不起作用,因為我的庫有容器存儲雙打而不是表現為雙精度的對象。

真是太遺憾了。 在C ++中,創建一個自動轉換為實際雙(引用)屬性的模板化類是微不足道的。 (或者對該問題的任何其他類型的引用。)您只需在模板化類中使用強制轉換運算符。 例如:運算符TYPE&(){返回值; 然后,您可以在通常使用double的任何地方使用HasValue <double>。

另一個是使用NaN(std :: numeric_limits)。 但我認為無法檢查變量是否為NaN。

正如litbJames Schek所說,C99為我們提供了isnan()。

但要小心! Nan值使數學和邏輯真正有趣! 你認為一個數字不能同時是NOT> = foo和NOT <= foo。 但是對於NaN,它可以。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM