[英]Bitset to float or double value c++
我有兩個IEEE754二進制表示位集,即float(32bit)和double(64bit)。 我如何將這個位集轉換為REAL浮點數或雙數?
使用bitset::to_ullong()
和memcpy()
這些位。
這是一個不依賴於使用IEEE-754類型的C ++實現的解決方案。
讓s
是位集的第一位。
設e
為32位或64位的下一個8位或11位。
設f
分別為剩余的23或52位。
讓Ebias
分別為127或1023。
設Emax
分別為255或2047。
設Fscale
為0x1p-23或0x1p-52。
然后,此代碼返回解釋為IEEE-754基本二進制浮點對象的bitset的值:
// Interpret the sign.
double S = s ? -1 : +1;
// Classify the exponent.
if (e == 0)
// The value is zero or subnormal.
return S * std::ldexp(f*Fscale, 1-Ebias);
else if (e < eMax)
// The value is normal.
return S * std::ldexp(1 + f*Fscale, e-Ebias);
else
// The value is NaN or infinite.
if (f == 0)
// The value is infinite.
return S * INFINITY;
else
// The value is a NaN.
return NAN;
這不會將NAN中的所有位(包括符號位)設置為與位集中的確切位匹配。 沒有可移植的方法可以做到這一點; 它通常必須通過使用memcpy
或通過字符類型的其他復制將位復制到float
或double
對象來完成,並且它要求C ++實現使用IEEE-754的float
或double
類型。 當然,上述要求C ++實現支持NAN
和INFINITY
,並且C ++實現中的浮點類型能夠表示值。
首先,一個不僅僅代表IEEE 754浮點 。 這種表現有很多。 假設你給了一個bitset
變量: param
,你想把它轉換成一個float
。 為確保這是有效的轉換,您需要確保:
param.size() == sizeof(float) * CHAR_BIT
param
的字節順序與endian::native
匹配 numeric_limits<float>::is_iec559
為true param
的基數與numeric_limits<float>::radix
匹配 如果所有這些都是真的那么有效這些位是你的內部浮點表示的格式,你可以使用這樣的簡單函數進行轉換(假設sizeof(unsigned long) == sizeof(float)
和sizeof(unsigned long long) == sizeof(double)
):
double foo(const bitset<sizeof(double) * CHAR_BIT>& param) {
const auto val = param.to_ullong();
double result;
memcpy(&result, &val, sizeof(double));
return result;
}
float foo(const bitset<sizeof(float) * CHAR_BIT>& param) {
const auto val = param.to_ulong();
float result;
memcpy(&result, &val, sizeof(float));
return result;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.