Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Floating point 有人能解释一下从十进制到IEE 754二进制32的转换吗?_Floating Point_Ieee 754 - Fatal编程技术网

Floating point 有人能解释一下从十进制到IEE 754二进制32的转换吗?

Floating point 有人能解释一下从十进制到IEE 754二进制32的转换吗?,floating-point,ieee-754,Floating Point,Ieee 754,我正在尝试将数字170.3转换为IEE 754二进制32浮点: 您可以从以下图片中看到我的工作: 将170转换为二进制 所以二进制中的170是10101010 将0.3转换为二进制 我们可以看到模式1001将永远重复,所以我们有类似的 0.3=0.01001粗体部分重复出现 把这些放在一起 当我们把这些数字放在一起时,我们可以得到整个值的二进制表示: 170.3=10101010.01001 其中粗体部分重复出现 将其转换为标准形式 170.3=1.010101001001x2⁷ 应如何存

我正在尝试将数字170.3转换为IEE 754二进制32浮点:

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

将170转换为二进制

所以二进制中的170是10101010

将0.3转换为二进制

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

0.3=0.01001粗体部分重复出现

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

170.3=10101010.01001

其中粗体部分重复出现

将其转换为标准形式

170.3=1.010101001001x2⁷

应如何存储: 这是我们的4个字节(32位)的分配方式:

  • 符号是0,因为我们使用的是正数
  • 指数为127+7=134,二进制为10000110
  • 分数由循环小数的前23位填写,在本例中为0101010010011001100(其中循环部分用粗体表示)
  • 因此,我们可以将这些数据组合在一起,将二进制数据存储到4个字节(32位)中:

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

    01000011-00101010-01001100-11001100
    

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

    #包括
    /*打印内存块的内容*/
    静态无效打印字节(常量无效*对象,大小){
    #ifdef_uucplusplus
    const unsigned char*const bytes=static_cast(对象);
    #else/\uu cplusplus
    常量无符号字符*常量字节=对象;
    #endif/\uu cplusplus
    尺寸i;
    printf(“[-”);
    对于(i=0;i>n)&1;
    }
    /*打印结果*/
    对于(int n=0;n<8;n++){
    printf(“%d”,二进制[n]);
    }
    printf(“%c”,“-”);
    }
    printf(“]\n\n”);
    }
    int main(){
    标准::cout
    有人能给我解释一下我的计算哪里出错了吗

    OP没有正确解释四舍五入

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


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


    从这两个位,最低有效位、符号位和舍入模式,可以确定正确的舍入值。

    如果只差1,可能只是舍入错误。我不认为是这种情况。如果我们从具有循环模式的数字中取前23位,它应该始终是相同的,对吗?第一个舍入位右边的ped是1,所以如果它是向上舍入而不是向下舍入,那么最后一位将是1。截断和舍入是非常不同的操作,重复模式是不相关的。哦,那么被截断的部分被舍入到最后一位?是的,没错。我相信IEEE-754有一些非常精确的舍入规则,以确保t二进制表示法是最接近实数的表示法。`0.010011001110011001…0.3 10000110.01001100111001101求和并四舍五入到24位`->这部分发生了什么事?被截断的数字是否四舍五入到最后一位,因此成为1?@Ganesh123重新写入以显示步骤。(是,考虑超过MS 24的位)
    01000011-00101010-01001100-11001100
    
     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.