2014-10-01 145 views
0

NaN可能有許多不同的二進制表示形式,它們通常可用於提供更多關於導致NaN的信息。任何格式爲x111 1111 1xxx xxxx xxxx xxxx xxxx xxxx的IEEE 32位浮點數都是NaN。此外,2個NaN(可能不同的二進制值)之間的任何比較評估爲false。將float與一個特定的NAN值進行比較的最正確方法是什麼?

所以給出了兩個浮筒:

float a = NaN1; 
float b = NaN2; 

兩者都是NaN的,但可能有不同的值高於x位,什麼是比較它們的二進制內容最正確的方式(即檢查它們是相同的類型 NaN)?

對我來說最明顯的方法是執行c樣式類型轉換,如:*(uint32_t*)&a == *(uint32_t*)&b但是,浮點的大小不保證是32位。

+0

浮點到整數轉換:http://stackoverflow.com/questions/2544394/c-浮動點 - 整數 - 轉換 - 轉換 – 9dan 2014-10-01 07:56:41

+1

什麼非32位大小浮動,支持NaNs,你期望遭遇?我認爲您在實踐中不太可能遇到任何支持NaN的非IEEE 754格式。我認爲'float'可能是64位IEEE 754雙精度類型,儘管這可能有點不正確。 – 2014-10-01 08:20:25

+0

@MarkDickinson這是嵌入式應用程序的代碼。我的主要目標是Raspberry Pi,但我的目標是用c編譯器支持任何半功能微控制器。我會毫不驚訝地遇到一個16位半精度浮點型。我無法想象這樣一種體系結構,其默認浮點數在未來十年內不會是16,32或64位,但我更願意在實際中避免不必要的限制。 – Ponkadoodle 2014-10-01 08:34:00

回答

5

我想第二個最明顯的是使用memcmp(),這是標準的功能比較存儲器位的兩個區塊的位:

const bool equal = memcmp(&a, &b, sizeof a) == 0; 

此外,如在評論所說,這是一個好主意驗證尺寸是相同的:

const bool equal = (sizeof a == sizeof b) && (memcmp(&a, &b, sizeof a) == 0); 

我不知道使用static_assert()是一個雙贏這裏,但我不是一個C++ 11的專家,無論是。

+0

既然這是C++,你可以添加一個static_assert(sizeof – 2014-10-01 07:44:06

+0

似乎過度殺傷力,但它應該解決所有可移植性問題。我想知道現代gcc是否能夠在sizeof(float)<= sizeof(int)的常見情況下將其優化爲簡單的int或long比較。 – Ponkadoodle 2014-10-01 07:48:22

+0

@Wallacoloo它是有能力的。 'memcmp'是我知道的所有主要編譯器的內在特徵。 – Sneftel 2014-10-01 08:27:07

相關問題