有人可以解释从十进制到 IEEE 754 Binary32 的转换吗?

Can someone explain a conversion from decimal to IEE 754 Binary32?

我正在尝试将数字 170.3 转换为 IEE 754 binary32 float:

你可以从下面的图片中看到我的作品:

将 170 转换为二进制

170 into Binary Working

所以170在二进制中是10101010

将 0.3 转换为二进制

0.3 into Binary Working

我们可以看到模式 1001 将永远重复,所以我们有类似的东西

0.3 = 0.01001 其中粗体部分重复出现

把这些放在一起

当我们将这些数字放在一起时,我们可以得到整个值的二进制表示:

170.3 = 10101010.01001

粗体部分重复出现。

正在将其转换为标准格式

Conversion to Base 2 Standard Form Working

170.3 = 1.010101001001 x 2⁷

如何存储:

我们的 4 个字节(32 位)是这样分配的:

  1. 符号为0,因为我们使用的是正数
  2. 指数 是 127 + 7 = 134 二进制是 10000110
  3. 分数然后由循环小数的前 23 位填充,在本例中为 01010100100110011001100(其中重复部分以粗体显示)

因此我们可以将这些组合在一起以获得二进制数据以存储到我们的 4 个字节(32 位)中:

01000011001010100100110011001100

其中,拆分为 4 个字节时应为:

01000011-00101010-01001100-11001100

然后我尝试 运行 这个 C++ 程序,它存储浮点数并打印内存:

#include <iostream>

/* Prints Contents of Memory Blocks */
static void print_bytes(const void *object, size_t size){
    #ifdef __cplusplus
    const unsigned char * const bytes = static_cast<const unsigned char *>(object);
    #else // __cplusplus
    const unsigned char * const bytes = object;
    #endif // __cplusplus

    size_t i;

    printf("[-");
    for(i = 0; i < size; i++)
    {
        //printf(bytes[i]);
        int binary[8];
        for(int n = 0; n < 8; n++){
            binary[7-n] = (bytes[size -1 - i] >> n) & 1;
        }
        /* print result */
        for(int n = 0; n < 8; n++){
            printf("%d", binary[n]);
        }
        printf("%c", '-');
    }
    printf("]\n\n");
}

int main () {

    std::cout << "\nStoring a Float in Memory";
    std::cout << "\n----------------------------\n\n";

    float height = 170.3f;

    std::cout << "Address is "<< &height << "\n\n";
    std::cout << "Size is "<<  sizeof(height) << " bytes\n\n";
    std::cout << "Value is " <<  height << "\n\n";

    std::cout << "Memory Blocks : \n";
    print_bytes(&height, sizeof(height));

    return 0;
}

但是在输出中,根据我的计算,我可以看到最后一位是 1 而不是 0:

Program Output

而且,当使用在线转换器时,最后一位也变成了 1:

Online Converter

谁能告诉我我的计算哪里出错了?

Could someone please explain to me where I went wrong in my calculation?

OP 没有正确考虑四舍五入。

通常转换使用四舍五入的值(四舍五入到最接近的值,接近偶数)

 12345678 9012345678901234
+10000110.                           134
        0.0100110011001100 1 1001...     0.3
+10000110.0100110011001100 1 1001... Sum
                           v vvvvvvv
                           1 |       extra bit past the 24
                             1       "or" of the rest of the bits
+10000110.0100110011001100 1 1       Value prior to rounding
^                        ^ ^ ^       These 4 bits & rounding mode determine round value
+                        1           Round value to add (assume round to nearest, ties to even)
+10000110.0100110011001101           Sum
+ 0000110.0100110011001101           23-bit portion explicitly stored.   

将算法修改为 1) 多一位,即“第 24”位(从第 0 位开始)和 2) 所有较小位(第 25、26 等)的“或”。

根据这2位,最低有效位、符号位和舍入模式,可以确定合适的舍入值。