gpt4 book ai didi

c - 快速浮点量化,按精度缩放?

转载 作者:太空宇宙 更新时间:2023-11-03 23:39:53 26 4
gpt4 key购买 nike

由于浮点精度会随着值的增大而降低,因此在某些情况下,根据值的大小量化值可能会很有用,而不是根据绝对值进行量化。

一种天真的方法可能是检测精度并将其放大:

float quantize(float value, float quantize_scale) {
float factor = (nextafterf(fabsf(value)) - fabsf(value)) * quantize_scale;
return floorf((value / factor) + 0.5f) * factor;
}

然而,这似乎太沉重了。

相反,应该可以屏蔽 float 尾数中的位模拟类似于转换为 16 位 float ,然后返回的东西 - 例如。

不是 float 位专家,我不能说生成的 float 是否有效 (or need normalizing)


对于速度,当有关舍入的精确行为不重要时,考虑 float 大小的快速量化 float 的方法是什么?

最佳答案

Veltkamp-Dekker 拆分算法会将 float 拆分为高位和低位部分。示例代码如下。

如果有效数中有 s 位(IEEE 754 64 位二进制中为 53),并且值 Scale在下面的代码中是 2b,然后是 *x0接收 x 的高 s-b 位, 和 *x1接收剩余的位,您可以丢弃它们(或从下面的代码中删除,因此永远不会计算)。如果 b 在编译时已知,例如常量 43,您可以替换 Scale使用适当的常量,例如 0x1p43 .否则,您必须以某种方式生成 2b

这需要舍入到最近的模式。 IEEE 754 算术就足够了,但其他合理的算术也可能没问题。它将关系舍入为偶数。

这假设x * (Scale + 1)不会溢出。这些操作必须以与被分离的值相同的精度进行评估。 ( double 代表 doublefloat 代表 float ,依此类推。如果编译器用 float 评估 double 表达式,这将中断。解决方法是将输入转换为最宽的 float -支持点类型,在该类型中执行拆分[相应地调整Scale],然后转换回来。)

void Split(double *x0, double *x1, double x)
{
double d = x * (Scale + 1);
double t = d - x;
*x0 = d - t;
*x1 = x - *x0;
}

关于c - 快速浮点量化,按精度缩放?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48698686/

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