簡體   English   中英

NaN對Bool的轉換:對還是錯?

[英]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.

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