IBM 单精度浮点数据转换为预期值
IBM Single Precision Floating Point data conversion to intended value
我需要从二进制文件中读取值。数据格式为 IBM 单精度浮点(4 字节十六进制指数数据(。我有C++代码,可以从文件中读取并取出每个字节并像这样存储它
unsigned char buf[BUF_LEN];
for (long position = 0; position < fileLength; position += BUF_LEN) {
file.read((char* )(&buf[0]), BUF_LEN);
// printf("n%8ld: ", pos);
for (int byte = 0; byte < BUF_LEN; byte++) {
// printf(" 0x%-2x", buf[byte]);
}
}
这将打印出每个字节的十六进制值。
此图指定 IBM 单精度浮点 IBM 单精度浮点
如何将缓冲区转换为浮点值?
该格式实际上非常简单,与IEEE 754 binary32格式没有特别区别(它实际上更简单,不支持任何"神奇的"NaN/Inf值,并且没有次正规数,因为这里的尾数在左侧有一个隐式0而不是隐式1(。
正如维基百科所说,
该数字表示为以下公式:(−1(符号× 0.有效× 16指数−64。
如果我们想象您读取的字节在uint8_t b[4]
中,那么结果值应该是这样的:
uint32_t mantissa = (b[1]<<16) | (b[2]<<8) | b[3];
int exponent = (b[0] & 127) - 64;
double ret = mantissa * exp2(-24 + 4*exponent);
if(b[0] & 128) ret *= -1.;
请注意,这里我用double
计算结果,因为IEEE 754float
的范围不足以表示相同大小的IBM单精度值(也相反(。另外,请记住,由于字节序问题,您可能需要恢复上面代码中的索引。
编辑:@Eric Postpischil正确地指出,如果您有C99或POSIX 2001可用,而不是mantissa * exp2(-24 + 4*exponent)
您应该使用ldexp(mantissa, -24 + 4*exponent)
,这应该在实现中更精确(并且可能更快(。
相关文章:
- 防止主数据类型C++的隐式转换
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 从矢量<无符号字符>转换为字符* 包括垃圾数据
- 如何在C++中将十六进制字符串转换为文本数据
- 将复杂的非基元C++数据类型转换为 Erlang/Elixir 格式,以使用 NIF 导出方法
- 从'size_t'转换为"常量双倍",可能会丢失数据
- 将传入的网络"char*"数据转换为"uint8_t"并返回的安全方法是什么?
- Static_cast转换为错误的数据类型,但结果仍然正确?
- 使用带有链表的堆栈数据结构将中缀转换为后缀
- PyTorch C++将数据转换为张量失败
- 使用从文件(stod、strtod、atof)中提取的数据C++从字符串转换为双精度.csv
- 虚拟成员函数的定义是否强制在同一转换单元中动态初始化静态数据成员?
- 如何使用 dart:ffi 将 Uint8List 转换为 C 等效数据类型
- 如何索引转换后的用户数据值?
- 使用 OpenCV 和 Android NDK 转换数据格式
- 如何转换数据结构以在 c++ 中转换字符*
- C++读取文件并转换数据
- 在C++中为C库强制转换数据类型
- 在C++中,关于位移和强制转换数据类型
- 最有效的方式转换数据帧到矩阵,反之亦然