2012-08-10 46 views
3

我正在尝试实现三角函数的范围缩减。 我发现这篇文章http://www.computer.org/csdl/proceedings/pcspa/2010/4180/00/4180b048-abs.html谈到了使用64位整数算术。三角函数的范围缩减

提出的想法应该可行,但在论文中似乎存在一些方程问题。 这是否比在fdlibm中实现的有效吗?

+3

你说“论文中的方程似乎存在一些问题” - 他们有什么问题? – Eric 2012-08-23 05:29:45

+0

我无法阅读链接中引用的论文;它在付费墙后面。你能否改写这个问题以使其他(非学术)人有可能回答你的问题? – eh9 2012-11-09 02:20:55

回答

0

对不起,我没有看到这是2012年的问题,而是2013年的一个。

这不适合作为评论,所以张贴在这里。我知道这并不直接回复OP的帖子,但我强烈认为这是该问题的先决条件。

如果您想要执行完整的浮点范围缩减,请参阅K.C. Ng在网上很容易找到“对巨大的自变量有着明显的减少:好到最后一刻”。

突出的问题是,在标准的三角函数(如sine(x))上执行范围缩减,其中x以弧度表示,必须执行涉及Pi的精确操作modmod需要将4/Pi扩展到足够的派系比特位以获得有意义的结果。本文详细介绍了该过程以及需要走多远。事实证明,这是潜在的100位,但不是数百万位。可能你已经意识到了这个问题,但是如果不知道,那么使用64位例程或其他方法来减少这个问题是你需要知道的。

正如@ eh9所说,你能否在墙上的链接和你面对的问题上发布一些信息?

+0

在非设计的情况下,“超精确”的三角范围缩减实际上有用吗?当然,在大多数用于trig函数的用例中,参数的计算需要乘以884279719003555/281474976710656(最接近'double'到π)的分数或者使用该分数计算的其他值。像Math.sin(Math.PI/180.0 * x)这样的表达式,如果使用Math.PI执行参数减少,则会将自180°以来的值报告为零;使用π减少参数不会提高精度。 – supercat 2014-06-05 23:30:20

+1

“超精确”三角范围缩减的一个理由在减少巨大变量:良好到最后位Bit_中表示的精度需求是__不被已知的实现者函数,如正弦(双x)'。使用'sqrt()'等函数的代码,不要期待很多ULP关闭的答案,但可能是最好的答案。与'sine()'类似,所讨论的方法提供了一种在整个'x'范围内提供高精度的方法。大多数应用程序不需要这个。本文讨论更合理,建议阅读它以获得更好的答案。 – chux 2014-06-06 04:21:10

+0

@supercat“表达式如Math.sin(Math.PI/180.0 * x)将使用Math.PI”True:“执行参数缩减时将180°的自(原文)作为零报告。但是这不是最好的答案,因为Math.sin(Math.PI)不是0.0。例如'罪(3.14159265358979311600/* Math.PI在我的系统上* /) - > 1.224647e-16'。 '1.224647e-16'与绝对值0.0的差别很小,但是作为典型的对数分布的FP,它比0.0更好。 – chux 2014-06-06 04:40:33