首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >表示十六进制格式的fp16最小数字

表示十六进制格式的fp16最小数字
EN

Stack Overflow用户
提问于 2019-06-22 06:27:45
回答 1查看 536关注 0票数 0

我需要在程序中使用float16的min_value,但不想显式地将其写出为十进制格式。我想知道如何用十六进制格式表示它。

代码语言:javascript
复制
float FP16_MIN = 5.96e-8;

根据我收到的最高答案,带有反范式的fp16 min的十六进制代码是0001

我想要一个函数来做:

代码语言:javascript
复制
float min = fp16_min(0x1); 

我在https://eigen.tuxfamily.org/dox/Half_8h_source.html的第185行找到了一个类似的函数,但我不理解它的实现。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-22 13:36:26

对于FP16,最小正法线值为:

代码语言:javascript
复制
                  1       0
                  5 43210 9876543210
                  S -E5-- ---F10----
          Binary: 0 00001 0000000000
             Hex: 0400
       Precision: HP
            Sign: Positive
        Exponent: -14 (Stored: 1, Bias: 15)
       Hex-float: +0x1p-14
           Value: +6.1035156e-5 (NORMAL)

最小正次正常值为:

代码语言:javascript
复制
                  1       0
                  5 43210 9876543210
                  S -E5-- ---F10----
          Binary: 0 00000 0000000001
             Hex: 0001
       Precision: HP
            Sign: Positive
        Exponent: -14 (Stored: 0, Bias: 14)
       Hex-float: +0x1p-24
           Value: +5.9604645e-8 (DENORMAL)

您可以在程序中将前者编写为0x1p-14,将后者编写为0x1p-24

如果您想从底层的十六进制表示形式进行转换,那么一个常用的技巧是在C中使用union,在C++中使用memcpy。有关详细信息,请参阅此答案:How is 1 encoded in C/C++ as a float (assuming IEEE 754 single precision representation)?

当然,要正确地做到这一点,您需要一个底层的16位浮点类型;这通常是不可用的。因此,您必须首先找出32位单精度格式中相应的十六进制是什么。对于1p-24来说,单精度计算很容易:

代码语言:javascript
复制
                  3  2          1         0
                  1 09876543 21098765432109876543210
                  S ---E8--- ----------F23----------
          Binary: 0 01100111 00000000000000000000000
             Hex: 3380 0000
       Precision: SP
            Sign: Positive
        Exponent: -24 (Stored: 103, Bias: 127)
       Hex-float: +0x1p-24
           Value: +5.9604645e-8 (NORMAL)

因此,作为单精度浮点数的相应表示形式将是0x33800000。(这一点不难看出:32位浮点数的偏置是127,因此您只需将103放入指数中即可得到-24。我相信您自己可以很容易地做到这一点;如果不能问出来的话。)

现在你可以写下:

代码语言:javascript
复制
#include <inttypes.h>
#include <iostream>

int main(void) {
    uint32_t abc = 0x33800000;
    float i;
    std::memcpy(&i, &abc, 4);
    std::cout<< i << std::endl;
    return 0;
}

打印的内容:

代码语言:javascript
复制
5.96046e-08
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56711084

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档