需要改变浮点精度

Need for changing floating point precision

我已经开始在 android 中阅读有关 RenderScript 的内容。我正在关注 this 个特定博客。

阅读时我遇到了名为设置浮点精度

的部分

这似乎是一个菜鸟问题,但为什么我们需要更改浮点精度?我们得到什么好处?有什么特别与 RenderScript 相关的吗?

精度基本上就是这样。它告诉屏幕上的东西将被绘制的精确程度。在某些情况下,浮点精度本身或与内存或性能等其他因素相比可能微不足道。如果你有一个小屏幕和低内存的设备,你不需要双精度来绘制模型。

这些精度适用于 renderscript 的计算部分。通常它们不会影响渲染,您将获得比 IEEE 754 一般低得多的 GL 精度,但您不应该使用它,因为 renderscript 的图形部分已被弃用。

从本质上讲,您应该使用 rs_fp_relaxed,因为这将使您进入最大范围的移动 GPU 和支持 SIMD 的 CPU 设备。

rs_fp_relaxed 为非范数和舍入为零操作启用清零。当您对 half、float 和 double 类型进行数学运算时,这会影响答案。如果你想通过移动 GPU 加速并且即使在本机支持双打的设备上也不会受到速度影响,你也应该避免双打。

我建议查看浮动上的 wiki 页面:https://en.wikipedia.org/wiki/Single-precision_floating-point_format

要点是浮点数存储在指数和尾数两部分,类似于科学记数法 1.23 * 10^13。当指数全为 0 时,您的数字是非正规的。因此,如果您的计算结果为指数为 0 的值,则尾数也将最终为零,而不是实际值。对于float32,具体值为1.1754942E-38(0x7ffff)到1.4E-45(0x1)和对应的负值。

当你用两个浮点数做数学运算时,舍入到零会出现一个实现不会计算额外的精度数字来知道最后一位舍入的方式,所以你可以从舍入中减少 1 ulp-甚至实施。通常 1 ulp 很小,但绝对差异取决于您的值在实数中的位置 space。例如 1.0 被编码为 0x3f800000。一个 1 ulp 错误可能会给你 0x3f800001 转换为 1.0000001.