假设我真的被迫记忆并想要更小的范围(类似于short
vs int
)。对于具有精度一半的浮点类型,着色器语言已经支持half
(不只是来回转换为-1到1之间的值,也就是说,返回如下的浮点数:{{1} })。是否存在2字节浮点数已存在的实现?
我也有兴趣知道为什么没有2字节浮点数的任何(历史?)原因。
答案 0 :(得分:13)
如果内存不足,你是否考虑放弃浮动概念?浮点数会占用大量的比特,只是为了保存小数点所在的位置。如果知道你需要小数点的位置,你可以解决这个问题,假设你想要保存一个美元值,你就可以可以把它保存在Cents:
uint16_t cash = 50000;
std::cout << "Cash: $" << (cash / 100) << "." << ((cash % 100) < 10 ? "0" : "") << (cash % 100) << std::endl;
如果您可以预先确定小数点的位置,那当然只是一个选项。但如果可以的话,总是喜欢它,因为这也加速了所有计算!
rgds,基拉: - )
答案 1 :(得分:9)
Re:实现:有人显然为C写了half
,这当然会在C ++中工作:https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/cellperformance-snippets/half.c
Re:为什么float
四个字节:可能是因为低于their precision is so limited。
答案 2 :(得分:5)
是 IEEE 754 standard for 16-bit floats。
这是一种新格式,于2008年基于2002年发布的GPU进行了标准化。
答案 3 :(得分:1)
为了在切换到整数时比Kiralein更进一步,我们可以定义一个范围并允许short的整数值表示该范围内的相等除法,如果跨越零则具有一些对称性:
short mappedval = (short)(val/range);
这些整数版本与使用半精度浮点数之间的差异:
答案 4 :(得分:1)
在不同的实现中可能有多种类型。相当于stdint.h的浮点数似乎是一个好主意。按类型调用(别名?)类型。 (float16_t?)现在只有4个字节的浮点数,但它可能不会变小。像长度和长度这样的术语大多随着时间变得毫无意义。使用128或256位计算机,它们可能意味着什么。
我正在使用图像(1 + 1 + 1字节/像素),我想表达每个像素相对于平均值的值。所以浮点或小心点,但不是原始数据的4倍。一个16位的浮动声音是正确的。
这个GCC 7.3不知道“一半”,也许是在C ++环境中。
答案 5 :(得分:0)
当前有2种常见的标准16位浮点格式: IEEE-754二进制16 和Google的 bfloat16 。由于它们是标准化的,因此很显然,如果任何了解此规范的人都可以编写实现。一些例子:
或者,如果您不想使用它们,也可以设计其他16位浮点格式并实现它
2字节浮点数,因为即使 float的精度也不足以进行正常操作,并且double
默认情况下应始终使用,除非受到带宽或缓存的限制尺寸。在C和类似C的语言中不带后缀的情况下,浮点文字也为double
。见
但是less-than-32-bit floats do exist。它们主要用于存储的目的,例如在图形中,当每个像素96位(每个通道32位* 3个通道)被浪费太多时,将转换为正常的32位浮点数,以用于计算(某些特殊硬件除外)。 OpenGL中存在各种10, 11, 14-bit float types。许多HDR格式为每个通道使用16位浮点格式,Direct3D 9.0以及Radeon R300和R420等某些GPU具有24位浮点格式。 compilers in some 8-bit microcontrollers也像PIC一样支持24位浮点数,其中32位浮点数的支持成本太高。 8位或更窄的浮点类型不太有用,但由于其简单性,通常在计算机科学课程中进行讲授。此外,ARM's instruction encoding中还使用了一个小的浮点数来表示小的浮点立即数。
IEEE 754-2008 revision正式添加了16位浮点格式,也就是 binary16 或half-precision,具有5位指数和11位尾数
某些编译器支持IEEE-754 binary16,但主要用于转换或矢量化运算,而不用于计算(因为它们不够精确)。例如,ARM的工具链具有__fp16
,可以在以下两种变体之间进行选择:IEEE和其他变体,具体取决于您需要更多范围还是NaN / inf表示形式。 GCC和Clang还支持__fp16
以及标准化名称_Float16
。参见How to enable __fp16 type on gcc for x86_64
最近由于AI的兴起,另一种称为bfloat16(brain floating-point format)的格式很常见,它是IEEE-754 binary32的前16位的简单截断
减少尾数的动机来自于Google的实验,该实验表明,只要在训练过程中仍可以表示接近零的微小值作为小差异的总和,就可以减小尾数。尾数较小还带来了许多其他优点,例如减少了乘法器功率和物理硅面积。
- float32:242 = 576(100%)
- float16:112 = 121(21%)
- bfloat16:82 = 64(11%)
GCC和ICC之类的许多编译器现在也具有支持bfloat16的功能
有关bfloat16的更多信息:
答案 6 :(得分:0)
如果您的CPU支持F16C,则可以使用以下命令快速启动并运行某些东西:
ValueConverter.prototype.connect
仍然使用32位浮点数执行数学运算(F16C扩展仅提供16/32位浮点数之间的转换-不存在使用16位浮点数进行算术运算的指令)。