您可以通過傳遞適當的串到C99 nan
, nanf
, nanl
功能來控制「有效載荷」位,但這些只會產生安靜 NaN的,並且該字符串的解釋是未指定的(大部分實現把它當作一個十六進制數字)。
或者使用工會:
#ifndef __STDC_IEC_559__
#error "This program requires IEEE floating point arithmetic"
#endif
#include <stdint.h>
#include <assert.h>
static_assert(sizeof(float) == sizeof(uint32_t),
"This program requires float to be 32 bits exactly");
float nanf_with_payload_bits(uint32_t payload)
{
if (payload & 0x7FA00000) abort();
union ieee_single {
float f;
uint32_t i;
} nan;
nan.i = 0x7FA00000 | payload;
return nan.f;
}
寫入工會的一個成員,然後從另一個讀取,當這兩種類型都完全一樣大小,不挑起C99 +勘誤未定義行爲。 (它是是在C89中未定義的行爲,但大多數編譯器定義它做你期望的。它可能仍然是C++中的未定義行爲,我不確定;但是,大多數編譯器再次定義它做你會做的期望。)
如果您使用此函數創建信號 NaN的,要知道,C99/C11附件在他們的行爲被明確未定義F.
不要試圖打破的的i
組件聯合成一個具有位域的結構。結構中的位字段的存儲器佈局是部分實現定義的並且部分未指定,並且特別地,位字段序列不必以與CPU字節順序相同的順序被打包到字中(或者實際上,妥善包裝)。
標準引用(所有C99):
- 這種使用工會的只有不確定行爲:6.2.6.1p7; J.1
- 結構內位域的佈局是不可預知的:6.2.6.1p1,2; 6.7.2.1p10,11,13; J.3.9
- 信號NaN的行爲是未定義:F.2.1
你是什麼意思,由排序瘋狂?我可能會遇到與此相關的問題。 – Chris 2012-04-28 17:59:47
簡短的版本是,'struct'中的位域順序不一定與*其他任何*符合。然而,在所有現代系統中,'uint32_t'中的位順序將與'float'中的位順序相同(過去曾經有不同的計算機,但AFAIK沒有完全製造出來一段時間)。這個盒子的長版太長了。我不得不看到導致你有問題的代碼來說更多。建議您提出一個關於該問題的新問題並將其鏈接到此處。 – zwol 2012-04-28 18:14:00
只是鏈接它:http://stackoverflow.com/questions/10366485/problems-casting-nan-floats-to-int謝謝! – Chris 2012-04-28 18:45:11