作为一个典型的例子,考虑三角函数的参数减少问题,如计算 x mod 2π 作为计算 sin(x) 的第一步。这种问题的难点在于你不能只用fmod
,因为 y(示例中为 2π)不可表示。
我想出了一个简单的解决方案,它适用于任意值 y,而不仅仅是 2π,我很好奇它如何与典型的参数减少算法进行比较(在性能上)。
基本思想是存储一个表,其中包含 log2(y) 到最大可能浮点指数范围内每个值 n 的 2n mod y 值,然后使用模算术的线性度,将该表中的值按位求和设置在 x 的值中。它相当于 N 个分支和最多 N 个加法,其中 N 是浮点类型中的尾数位数。结果不一定小于 y,但它以 N*y 为界,并且可以再次应用该过程以给出以 log2(N)*y 或 fmod
为界的结果。可以简单地在这一点上以最小的错误使用。
这可以改进吗?典型的三角参数减少算法是否适用于任意 y 或仅适用于 2π?
最佳答案
数学库中三角函数的最新实现可以在整个输入域中正常工作。它们通过表示与 π 相关的一些常数(例如 2/π)来实现,以达到所用浮点格式的足够精度。
例如,对于 IEEE double 的三角函数减少,需要将常量表示为大约 1150 位,以用于本质上是定点计算的内容。这种方法是由以下论文的作者开创的:
M. 佩恩和 R. 哈内克。三角函数的弧度缩减。
SIGNUM 通讯, 18:19–24, 1983
最初的想法后来被其他作者修改和完善。基于浮点和基于整数的变体都是可能的。 FDLIBM 库在这里提供了一个完整的示例:
http://www.netlib.org/fdlibm/e_rem_pio2.c
FDLIBM 的作者的以下论文描述了此代码中使用的方法
http://www.validlab.com/arg.pdf
K.C.吴。减少巨大参数的参数:好到最后
请注意,不需要将中间计算进行到 1150 位。由于在归约中,前导位取消计算只需要涉及完整常数内的小得多的位组。由于需要多精度算术,这仍然是一个相当昂贵的操作。
对于更严格限制范围内的三角函数参数减少,其他更经济的方案是可能的,尤其是当硬件支持 FMA(融合乘加)时。
用于三角参数约简的技术似乎可以扩展到任意高精度常数的约简。
关于math - 计算 x mod y,其中 y 不能表示为 float ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6475715/