问题描述
我正在尝试将数字 170.3 转换为 IEE 754 binary32 float :
您可以从以下图片中看到我的工作:
将170转换为二进制
所以Binary中的170是10101010
将0.3转换为二进制
我们可以看到模式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位)的方式:
- 符号为0,因为我们正在使用正数
- 指数是127 + 7 = 134,二进制是10000110
- 分数然后由我们的循环十进制的前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:
而且,当使用在线转换器时,最后一位也变为1:
有人可以向我解释我的计算错误了吗?
解决方法
有人可以向我解释我的计算错误了吗?
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等)的“或”。
从这两个位(最低有效位,符号位和舍入模式)中,可以确定适当的舍入值。