R..*_*R.. 15 language-agnostic math floating-point modulo
作为规范示例,考虑三角函数的参数减少问题,如计算xmod2π作为计算sin(x)的第一步.这种问题很难,因为你不能只使用fmod
,因为y(在例子中为2π)不具有代表性.
我提出了一个简单的解决方案,适用于任意值y,而不仅仅是2π,我很好奇它是如何比较(性能)与典型的参数减少算法.
基本思想是将一个包含2 n mod y 值的表存储在log2(y)范围内的每个值n到最大可能的浮点指数,然后使用模运算的线性,将此表中的值相加在x的值中设置的位.它相当于N个分支和最多N个加法,其中N是浮点类型中的尾数位数.结果不一定小于y,但是它受N*y的限制,并且可以再次应用该过程以给出由log2(N)*y限定的结果,或者fmod
可以简单地在此处使用具有最小误差的结果.
这可以改善吗?并且典型的三角参数约简算法是否适用于任意y或仅适用于2π?
nju*_*ffa 10
数学库中的三角函数的现有技术实现在整个输入域中正确地工作.它们通过将与π相关的一些常数(例如2 /π)表示为所使用的浮点格式的足够精度来实现.
例如,对于IEEE双精度中的trig函数减少,需要将常数表示为大约1150位,以用于本质上是定点计算.这种方法是由以下论文的作者开创的:
M. Payne和R. Hanek.三角函数的Radian减少.SIGNUM时事通讯,18:19-24,1983
从那以后,其他作者对原始观念进行了修改和完善; 基于浮点和基于整数的变体都是可能的.FDLIBM库提供了一个完整的示例:
http://www.netlib.org/fdlibm/e_rem_pio2.c
FDLIBM的作者的以下论文描述了该代码中使用的方法
http://www.validlab.com/arg.pdf KC Ng.巨大争论的论据减少:好到最后一点
注意,没有必要将中间计算携带到1150位.由于在减少中,前导位取消计算仅需要在完全常量内涉及更小的位组.由于需要多精度算术,这仍然是相当昂贵的操作.
对于更严格限制范围的三角函数参数减少,其他更经济的方案是可能的,尤其是当硬件支持FMA(融合乘法 - 加法)时.
用于三角参数减少的技术似乎可以通过任意高精度常数进行减少.