math - 计算 x mod y,其中 y 不能表示为 float

标签 math language-agnostic floating-point modulo

作为一个典型的例子,考虑三角函数的参数减少问题,如计算 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/

相关文章:

math - 测试数字是否在循环间隔内

java - vector 上的 l2 标准化错误 [Java]

math - float 学被破坏了吗?

audio - 如何在 Ubuntu 11.10 中创建音频日志

language-agnostic - 信号量符号 - 为什么 V 和 P 而不是 S 和 W

math - 为什么浮点运算在添加小数时不能给出准确的结果?

iphone - 如何在 Swift 4 中打印 float 后的 5 位数字,有没有最短的方法?

math - 比较传统数学符号与 APL/J 符号的示例

java - 检查点在Java Swing中是否在线

security - 如何在 RSA 加密的情况下计算数字的模乘逆?