【发布时间】:2011-09-22 11:22:34
【问题描述】:
作为一个典型的例子,考虑三角函数的参数约简问题,如计算 x mod 2π 作为计算 sin(x) 的第一步。这种问题的难点在于不能只用fmod,因为y(例子中是2π)是不可表示的。
我想出了一个简单的解决方案,它适用于任意值 y,而不仅仅是 2π,我很好奇它与典型的参数缩减算法相比(在性能上)如何。
基本思想是存储一个表,其中包含 2n mod y 的值,对于 log2(y) 范围内的每个值 n 到最大可能的浮点指数,然后使用线性模运算,将此表中的值与 x 的值中设置的位相加。它相当于 N 个分支和最多 N 个加法,其中 N 是浮点类型中的尾数位数。结果不一定小于 y,但它以 N*y 为界,并且可以再次应用该过程以给出以 log2(N)*y 或fmod 为界的结果,此时可以简单地使用最小错误。
这可以改进吗?典型的三角参数缩减算法是否适用于任意 y 或仅适用于 2π?
【问题讨论】:
-
那么表是如何解决你的问题的呢?由于 2Pi(超越数)不能以任何紧凑的方式表示,您如何期望 2^n mod 2Pi 可以表示?为什么它会给出更正确的结果?
-
可以用最多1ulp的误差来表示。另一方面,x mod y 其中 y 的误差最多为 1ulp,误差最高为 x/y * 1ulp。特别是如果 x 比 y 大几个数量级的 MANT_BITS,则使用 y 的近似值进行模运算的结果没有意义,即它完全是错误的。
-
@R..:如果 X 比 Y 大许多数量级,那么在多少真实世界的情况下 X mod Y 仍然有意义?如果 X 是 Kahan Summation 的上分量,我可以看到它的确切值是有意义的,但否则精确计算这样一个模数的想法似乎是在说一个测量为 25/32" 的孔(最接近 1 /64") 不应被描述为与 2 毫米钉子的尺寸大致相同,而应被描述为具有 0.0061515748" 的间隙。如果孔恰好是 25/32",则测量结果是正确的,但是...
-
...缺少表明孔大小实际上是 1/64 的精确倍数的信息,计算出的大小差异中的任何假定精度都是没有意义的。
标签: math language-agnostic floating-point modulo