[英]NaN to Bool conversion: True or False?
C ++規范的哪一部分或IEEE浮點規范聲明NaN值應該轉換為true
而不是false?
如果我查看C ++標准部分4.12布爾轉換它說:
零值,空指針值或空成員指針值轉換為false; 任何其他值都轉換為true。
現在IEEE浮動說NaN將false與任何其他值進行比較。 因此,NaN是真還是假取決於你如何進行比較(下圖)。 因此,我認為必須明確提及。
value == 0 ? false : true
value != 0 ? true : false
現在,轉換為整數怎么樣? 下面的簡短程序顯示轉換為整數的變量NAN產生最小整數,而常量轉換為0(使用GCC)。 這看起來很奇怪。
#include <iostream>
#include <cmath>
void write( double r, int i, bool b )
{
std::cout << r << " == " << i << " == " << (b ? "True" : "False") << std::endl;
}
int main()
{
double value = NAN;
write( value, value, value );
write( NAN, NAN, NAN );
}
輸出:
nan == -2147483648 == True
nan == 0 == True
將NaN轉換為零但將bool轉換為True似乎令人不安。 我也不是像MatLab這樣的東西會使用像int16
這樣的函數將NaN轉換為0。
那么,相關標准的具體內容是說明NaN如何轉換為布爾值和整數值?
我也在標記C,因為雖然它可能沒有定義布爾轉換,但它可能定義了一個整數轉換並在條件中使用,我懷疑C ++將遵循相同的規則
在C和C ++中,將NAN
轉換為整數類型( bool
除外)時,行為未定義:
C99 6.3.1.4/1:當實數浮點類型的有限值轉換為
_Bool
以外的整數類型時,小數部分被丟棄(即,該值被截斷為零)。 如果整數部分的值不能用整數類型表示, 則行為是未定義的 。C ++ 11 4.9 / 1:浮點類型的prvalue可以轉換為整數類型的prvalue。 轉換截斷; 也就是說,丟棄小數部分。 如果截斷的值無法在目標類型中表示,則行為未定義 。 [ 注意:如果目的地類型是
bool
,請參閱4.12。 - 尾注 ]
在這兩種語言中,將NAN
轉換為bool
(或_Bool
)給出true
(或1
):
C99 6.3.1.2/1:當任何標量值轉換為
_Bool
,如果值比較等於0,則結果為0; 否則,結果為1。C ++ 11 4.12 / 1:零值,空指針值或空成員指針值轉換為
false
; 任何其他值都轉換為true
。
NAN
不是零值,並且不等於零。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.