簡體   English   中英

Bitset為float或double值c ++

[英]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或通過字符類型的其他復制將位復制到floatdouble對象來完成,並且它要求C ++實現使用IEEE-754的floatdouble類型。 當然,上述要求C ++實現支持NANINFINITY ,並且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.

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