有人可以解释从十进制到 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 位)是这样分配的:
- 符号为0,因为我们使用的是正数
- 指数 是 127 + 7 = 134 二进制是 10000110
- 分数然后由循环小数的前 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位,最低有效位、符号位和舍入模式,可以确定合适的舍入值。
我正在尝试将数字 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 位)是这样分配的:
- 符号为0,因为我们使用的是正数
- 指数 是 127 + 7 = 134 二进制是 10000110
- 分数然后由循环小数的前 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位,最低有效位、符号位和舍入模式,可以确定合适的舍入值。