将符号位,指数和尾数转换为浮点型?

Ray*_*ito 2 c c++ math floating-point precision

我有符号位,指数和尾数(如下代码所示)。我正在尝试采用此值并将其转换为浮点数。这样做的目的是获得59.98(它将显示为59.9799995

uint32_t FullBinaryValue = (Converted[0] << 24) | (Converted[1] << 16) |
                            (Converted[2] << 8) | (Converted[3]);

unsigned int sign_bit = (FullBinaryValue & 0x80000000);
unsigned int exponent = (FullBinaryValue & 0x7F800000) >> 23;
unsigned int mantissa = (FullBinaryValue & 0x7FFFFF);
Run Code Online (Sandbox Code Playgroud)

我最初尝试做的只是将它们一点一点地放置在原处:

float number = (sign_bit << 32) | (exponent << 24) | (mantissa);

但这给了我 2.22192742e+009.

然后,我要使用公式:1.mantissa + 2^(exponent-127)但是您不能在二进制数中放置小数位。

然后我尝试获取每个单独的值(指数,特征,尾数),然后得到

Characteristic: 0x3B (Decimal: 59)
Mantissa: 0x6FEB85 (Decimal: 7334789)
Exponent: 0x5 (Decimal: 5) This is after subtracting it from 127
Run Code Online (Sandbox Code Playgroud)

然后,我将采用这些数字,然后将其改造为printf。但是我不知道如何将尾数十六进制转换为应该的十六进制(幂为负指数)。

关于如何将这三个变量(符号位,指数和尾数)转换为浮点数的任何想法?

为PAUL R编辑 这是最小,完整和可验证格式的代码。我uint8_t Converted[4]之所以在那儿添加它,只是因为它是我最终获得的价值,并且使它可运行。

#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

int main(int argc, char *argv[])
{
    uint8_t Converted[4];
    Converted[0] = 0x42;
    Converted[1] = 0x6f;
    Converted[2] = 0xEB;
    Converted[3] = 0x85;

    uint32_t FullBinaryValue = (Converted[0] << 24) | (Converted[1] << 16) |
                                (Converted[2] << 8) | (Converted[3]);

    unsigned int sign_bit = (FullBinaryValue & 0x80000000);
    unsigned int exponent = (FullBinaryValue & 0x7F800000) >> 23;
    unsigned int mantissa = (FullBinaryValue & 0x7FFFFF);

    float number = (sign_bit) | (exponent << 23) | (mantissa);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Fra*_*eux 5

问题在于表达式float number = (sign_bit << 32) | (exponent << 24) | (mantissa);首先计算an unsigned int,然后将该值转换为float。基本类型之间的转换将保留值,而不是内存表示形式。您试图做的是将内存表示形式重新解释为另一种类型。您可以使用reinterpret_cast

试试这个代替:

uint32_t FullBinaryValue = (Converted[0] << 24) | (Converted[1] << 16) |
                           (Converted[2] << 8) | (Converted[3]);


float number = reinterpret_cast<float&>(FullBinaryValue);
Run Code Online (Sandbox Code Playgroud)