Sam*_*rsa 26 c++ floating-point 16-bit half-precision-float
假设我真的被迫记忆并想要一个更小的范围(类似于短与int).着色器语言已经支持short具有精度一半的浮点(不只是来回转换为-1到1之间的值,也就是说,像这样返回一个浮点数:) int.是否存在2字节浮点数已经存在的实现?
我也有兴趣知道为什么没有2字节浮点数的任何(历史?)原因.
phu*_*clv 15
目前有 2 种常见的标准 16 位浮点格式:IEEE-754 binary16和 Google 的bfloat16。由于它们是标准化的,显然如果任何了解规范的人都可以编写实现。一些例子:
或者如果你不想使用它们,你也可以设计不同的16位浮点格式并实现它
通常不使用 2 字节浮点数,因为即使是浮点数的精度也不足以进行正常操作,double除非您受到带宽或缓存大小的限制,否则应始终默认使用。double在 C 和类 C 语言中不使用后缀时也可以使用浮点文字。看
但是小于 32 位的浮点数确实存在。它们主要用于存储目的,例如在图形中,每像素 96 位(每通道 32 位 * 3 通道)太浪费了,并将转换为普通的 32 位浮点数进行计算(某些特殊硬件除外) )。OpenGL 中存在各种 10、11、14位浮点类型。许多 HDR 格式为每个通道使用 16 位浮点数,Direct3D 9.0 以及一些 GPU(如 Radeon R300 和 R420)具有 24 位浮点数格式。某些 8 位微控制器(如PIC)中的编译器也支持 24 位浮点数其中 32 位浮点支持成本太高。8 位或更窄的浮点类型不太有用,但由于它们的简单性,它们经常在计算机科学课程中教授。此外,ARM 的指令编码中也使用了小浮点数,用于小浮点立即数。
在IEEE 754-2008修订正式加入一个16位浮点格式,AKA binary16或半精度,用一个5位指数和11位尾数
一些编译器支持 IEEE-754 binary16,但主要用于转换或矢量化操作,而不是用于计算(因为它们不够精确)。例如,ARM 的工具链__fp16可以在 2 个变体之间进行选择:IEEE 和替代方案,具体取决于您是想要更多范围还是 NaN/inf 表示。GCC和Clang也支持__fp16标准化名称_Float16。请参阅如何在 gcc 上为 x86_64 启用 __fp16 类型
最近由于人工智能的兴起,另一种称为bfloat16(大脑浮点格式)的格式开始流行,它是IEEE-754 binary32 的前 16 位的简单截断
减少尾数背后的动机来自谷歌的实验,该实验表明,只要减少尾数就可以了,只要它仍然可以表示接近零的微小值,作为训练期间小差异总和的一部分。较小的尾数带来了许多其他优势,例如降低乘法器功率和物理硅面积。
- float32: 24 2 =576 (100%)
- float16: 11 2 =121 (21%)
- bfloat16: 8 2 =64 (11%)
许多编译器,如GCC和ICC现在也获得了支持 bfloat16 的能力
有关 bfloat16 的更多信息:
T.J*_*der 12
Re:实现:有人显然是half为C 编写的,当然可以用C++ 编写:https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/cellperformance-snippets /half.c
Re:为什么是float四个字节:可能因为在它之下,它们的精度非常有限.
Kir*_*kes 12
如果你内存不足,你是否考虑放弃浮动概念?浮点数会占用很多比特,只是为了保存小数点所在的位置.如果你知道你需要小数点的位置,你可以解决这个问题,假设你想保存一个美元值,你可以把它保存在美分中:
uint16_t cash = 50000;
std::cout << "Cash: $" << (cash / 100) << "." << ((cash % 100) < 10 ? "0" : "") << (cash % 100) << std::endl;
Run Code Online (Sandbox Code Playgroud)
如果您可以预先确定小数点的位置,那当然只是一个选项.但如果可以的话,总是喜欢它,因为这也加速了所有的计算!
rgds,基拉:-)
| 归档时间: |
|
| 查看次数: |
25534 次 |
| 最近记录: |