C++ 半精度浮点数转换
本帖最后由 hellozl 于 2023-11-29 19:22 编辑目的:
待转换数据(2字节) 0x2E0F 0x2E0F 0x2E1A 0x2E26 0x2E26
想要得到的数据 +1.799219+1.799219+1.800897+1.802728+1.802728
目前,我采集到一系列数据,数据形式为2字节的数,希望将其转化为浮点数。
然而,float存储时应占据4字节,通过常见的类型强制转换方案(如static_cast、reinterpret_cast)无法实现。
查阅资料得知,存在一种半精度的浮点数类型,在利用half.hpp定义的half类型,尝试转换后,未得到理想结果。
尝试使用boost手册中boost.math的float16_t类型,但是报错boost命名空间没有float16_t的定义。
求助:请问将上述待转换数据转换为浮点数,应采用什么方法。
附:常见4字节float转换代码
```
#include <iostream>
using namespace std;
typedef unsigned char BYTE;
int main()
{
BYTE data[] = {0x2E, 0x0F, 0x2E, 0x0F, 0x00, 0x00};
float* fvalue = reinterpret_cast<float*>(data);
cout << *fvalue<< endl;
return 0;
}
```
你怎么确定0x2E0F就是+1.799219?直接转浮点数好像才1.65多点
直接套用计算公式 JuncoJet 发表于 2023-11-29 13:50
直接套用计算公式
谢谢分享,按照这个标准计算的结果与我调用half.hpp库得到的结果一致,但是和我的对应关系不同,我会再次确认下,对应关系是不是出错了,谢谢你{:1_919:}
#include <iostream>
#include "half.hpp"
using namespace std;
typedef unsigned char BYTE;
int main()
{
BYTE data[] = {0x0F, 0x2E, 0x00, 0x0F, 0x00, 0x00};
half_float::half* fvalue = reinterpret_cast<half_float::half*>(data);
cout << *fvalue<< endl;
return 0;
}
bester 发表于 2023-11-29 13:36
你怎么确定0x2E0F就是+1.799219?直接转浮点数好像才1.65多点
谢谢你的回答,我发现我采集的数据从16进制到浮点数,是按比例换算的,我一开始的解决方向错误,实际上可由下式换算0x2dca->11722;V=11722/65535*(5-(-5))。 hellozl 发表于 2023-11-29 19:22
谢谢你的回答,我发现我采集的数据从16进制到浮点数,是按比例换算的,我一开始的解决方向错误,实际上可 ...
怪不得怎么算都不对,有算法就很好写代码了,直接将16进制转10进制,再转成float相除
页:
[1]