Math 计算x mod y,其中y不能表示为浮点 作为一个典型的例子,考虑三角函数的参数约简问题,如计算X mod 2π作为计算Sin(x)的第一步。这类问题很难解决,因为不能只使用fmod,因为y(示例中的2π)是不可表示的

Math 计算x mod y,其中y不能表示为浮点 作为一个典型的例子,考虑三角函数的参数约简问题,如计算X mod 2π作为计算Sin(x)的第一步。这类问题很难解决,因为不能只使用fmod,因为y(示例中的2π)是不可表示的,math,language-agnostic,floating-point,modulo,Math,Language Agnostic,Floating Point,Modulo,我提出了一个简单的解决方案,它适用于任意值y,而不仅仅是2π,我很好奇它(在性能上)与典型的参数缩减算法相比如何 基本思想是存储一个表,其中包含log2(y)到最大可能浮点指数范围内每个值n的2n mod y值,然后使用模运算的线性,将该表中的值与x值中设置的位相加。它总共有N个分支,最多N个加法,其中N是浮点类型的尾数位数。结果不一定小于y,但它是以N*y为界的,并且可以再次应用该过程来给出以log2(N)*y或fmod为界的结果,此时可以简单地使用,误差最小 这能改进吗?典型的三角参数简化算

我提出了一个简单的解决方案,它适用于任意值y,而不仅仅是2π,我很好奇它(在性能上)与典型的参数缩减算法相比如何

基本思想是存储一个表,其中包含log2(y)到最大可能浮点指数范围内每个值n的2n mod y值,然后使用模运算的线性,将该表中的值与x值中设置的位相加。它总共有N个分支,最多N个加法,其中N是浮点类型的尾数位数。结果不一定小于y,但它是以N*y为界的,并且可以再次应用该过程来给出以log2(N)*y或
fmod
为界的结果,此时可以简单地使用,误差最小


这能改进吗?典型的三角参数简化算法是适用于任意y还是仅适用于2π?

数学库中三角函数的最新实现在整个输入域中都能正确工作。它们通过表示一些与π相关的常数来实现,例如2/π,以达到所用浮点格式的足够精度

例如,对于IEEE双精度中的trig函数缩减,需要将常数表示为约1150位,以便在本质上是定点计算的情况下使用。这一方法由以下论文的作者首创:

佩恩和哈内克。三角函数的弧度归约。 SIGNUM通讯,18:19-241983

从那时起,其他作者对原始想法进行了修改和完善;基于浮点和基于整数的变量都是可能的。FDLIBM库提供了一个完整的示例:

FDLIBM作者的以下文章描述了此代码中使用的方法

吴国强。大参数的参数减少:好到最后一点

请注意,中间计算不必进行到1150位。因为在缩减中,前导位取消了计算,只需要在全常量中包含更小的一组位。由于需要多精度算法,这仍然是一个相当昂贵的操作

对于更严格限制范围内的三角函数参数缩减,其他更经济的方案是可能的,特别是当硬件支持FMA(融合乘法-加法)时


用于三角参数约化的技术似乎可以扩展到任意高精度常数的约化。

那么该表如何解决您的问题呢?既然2Pi(一个超越数)不能以任何紧凑的方式表示,那么您如何期望2^n mod 2Pi是可表示的呢?为什么它会给出一个更正确的结果呢?它可以用最多1ulp的误差来表示。另一方面,x mod y(其中y的误差最大为1ulp)的误差最大为x/y*1ulp。特别是,如果x比y大许多数量级,则使用近似值对y进行模运算的结果没有意义,也就是说,这是完全错误的。@R..:如果x比y大许多数量级,那么在多少实际情况下x模y会有意义?如果X是Kahan求和的上分量,我可以看到它的精确值是有意义的,但是,如果计算这样一个模数的想法是精确的,那么,一个测量为25/32”(精确到1/64)的孔不应该被描述为与一个2mm的销钉大小相同,但应描述为具有0.0061515748“的间隙。如果孔恰好为25/32”,则测量结果是正确的,但是……如果没有信息表明孔的尺寸实际上是1/64的精确倍数,则计算尺寸差中的任何假定精度都是无意义的。