有人可以解释从十进制到IEE 754 Binary32的转换吗? 将170转换为二进制将0.3转换为二进制将它们放在一起将其转换为标准格式应如何存储:

问题描述

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

您可以从以下图片中看到我的工作:

将170转换为二进制

170 into Binary Working

所以Binary中的170是10101010

将0.3转换为二进制

0.3 into Binary Working

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

0.3 = 0.0 1001 ,其中粗体部分重复出现

将它们放在一起

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

170.3 = 10101010.0 1001

重复出现的粗体部分。

将其转换为标准格式

Conversion to Base 2 Standard Form Working

170.3 = 1.01010100 1001 x2⁷

应如何存储:

这是分配4个字节(32位)的方式:

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

因此,我们可以将它们组合在一起以获取二进制数据,以将其存储到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

有人可以向我解释我的计算错误了吗?

解决方法

有人可以向我解释我的计算错误了吗?

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等)的“或”。

从这两个位(最低有效位,符号位和舍入模式)中,可以确定适当的舍入值。