我需要在程序中使用float16的min_value,但不想以十进制格式将其显式写入。我想知道如何以十六进制格式表示它。
float FP16_MIN = 5.96e-8;
根据我收到的最高答案,带分母的fp16分钟的十六进制代码为0001
。
我想要一个函数来做:
float min = fp16_min(0x1);
我在https://eigen.tuxfamily.org/dox/Half_8h_source.html的第185行中找到了类似的功能,但我不了解其实现。
答案 0 :(得分:2)
对于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语言中使用并集,在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)
因此,作为单个精度浮点数的对应表示形式为0x33800000
。 (这不难发现:32位浮点数的偏差为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