Floating point 有人能解释一下从十进制到IEE 754二进制32的转换吗?
我正在尝试将数字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位)的分配方式: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⁷ 应如何存
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.