以十六进制格式表示 fp16 最小数
Represents fp16 minimum number in hex format
我需要在我的程序中使用 float16 的min_value,但不想以十进制格式显式写出它。我想知道如何以十六进制格式表示它。
float FP16_MIN = 5.96e-8;
根据我收到的最高答案,带有 denorm 的 fp16 分钟的十六进制代码是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 中使用并集,在 C++ 中使用memcpy
。有关详细信息,请参阅此答案:如何在 C/C++ 中将 1 编码为浮点数(假设 IEEE 754 单精度表示)?
当然,要正确地执行此操作,您需要一个底层的 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
相关文章:
- C++将浮点指针值舍入为小数位数
- 从给定的 I 和 D 序列中形成最小数
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- 使用 std::index_sequence 初始化具有固定大小数组成员的 POD 结构容器
- 计算 PI 最多 42 位小数
- 为什么我必须添加一个小数才能在C++中正确计算此数学
- 返回浮点数的小数位数
- 为什么 std::cout 打印浮点数、双精度和长双精度到相同的小数精度?
- 在数学上将浮点数四舍五入到 N 位小数
- 打印双精度的整个非小数部分
- 声明后,gcc 的动态大小数组是否与标准数组有效相同?
- 如何在C++中对OpenCV垫的小数进行四舍五入?
- 将 int 数组转换为带有小数C++的双精度数组
- Arduino如何制作返回固定大小数组的函数
- 从浮点数中删除小数部分但保留类型的有效方法
- 分配新的零大小数组可以具有有效价值吗?
- c++只关心2位小数,没有设置精度
- 有没有一种方法可以在不设置精度的情况下设置小数位数
- gcc c++编译器中的零大小数组
- 以十六进制格式表示 fp16 最小数