gpt4 book ai didi

c++ - 表示十六进制格式的 fp16 最小数字

转载 作者:行者123 更新时间:2023-11-28 01:20:11 64 4
gpt4 key购买 nike

我需要在我的程序中使用 float16 的最小值,但不想明确地以十进制格式写出来。我想知道如何以十六进制格式表示它。

float FP16_MIN = 5.96e-8;

根据我收到的最佳答案,带有 denorm 的 fp16 min 的十六进制代码是 0001

我想要一个函数来做:

float min = fp16_min(0x1); 

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

最佳答案

对于 FP16,最小正正常值为:

                  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)

最小正次正规值是:

                  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 这很容易以单精度计算:

                  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)

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

现在你可以写:

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

打印:

5.96046e-08

关于c++ - 表示十六进制格式的 fp16 最小数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56711084/

64 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com