hellozl 发表于 2023-11-29 11:17

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;
}
```

晨曦的雾 发表于 2023-11-29 12:34

bester 发表于 2023-11-29 13:36

你怎么确定0x2E0F就是+1.799219?直接转浮点数好像才1.65多点

JuncoJet 发表于 2023-11-29 13:50


直接套用计算公式

hellozl 发表于 2023-11-29 16:18

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;
}

hellozl 发表于 2023-11-29 19:22

bester 发表于 2023-11-29 13:36
你怎么确定0x2E0F就是+1.799219?直接转浮点数好像才1.65多点

谢谢你的回答,我发现我采集的数据从16进制到浮点数,是按比例换算的,我一开始的解决方向错误,实际上可由下式换算0x2dca->11722;V=11722/65535*(5-(-5))。

bester 发表于 2023-11-29 20:30

hellozl 发表于 2023-11-29 19:22
谢谢你的回答,我发现我采集的数据从16进制到浮点数,是按比例换算的,我一开始的解决方向错误,实际上可 ...

怪不得怎么算都不对,有算法就很好写代码了,直接将16进制转10进制,再转成float相除
页: [1]
查看完整版本: C++ 半精度浮点数转换