准确高效地计算两个正弦比的对数

计算科学 数字 表现 浮点
2021-11-25 05:35:06

对于与特殊函数实现相关的探索性工作,我需要计算,其中的情况对整体准确性至关重要。logsinysinx0xy2x<π2xy

鉴于正弦的比率通常接近于一,我想使用该log1p函数尽可能准确地计算对数,这意味着我需要找到一种方法来计算准确。sinysinx1

给定前提条件,基于 Sterbenz 引理,可以用二进制浮点算术精确计算。在角度和和半角公式的帮助下,我得到δ=yx

siny=sin(x+δ)=sin(x)+(sin(δ)cos(x)2sin2(δ2)sinx)

紧随其后

sinysinx1=sin(δ)cosxsinx2sin2(δ2)

给定前提条件,减法没有取消的风险,因为被减数至少是被减数的两倍,而且通常比那大得多。这种计算对性能很敏感,并且由于sincos可以使用一次计算的函数,我还考虑将上面的代码重写如下,以将计算所有超越数的成本降低到仅两个调用(大概是与舍入误差小幅增加)sincossincos

2sin(δ2)cos(δ2)cosxsinx2sin2(δ2)

这可以进一步转化为以下内容,但我尚未检查这是否真的有利

2sin(δ2)(cos(δ2)cosxsinxsin(δ2))

是否有这种计算的替代安排也能保持完全的准确性并进一步最小化计算成本?可以假设融合乘加 (FMA) 的可用性。抽象运营成本如下:add, sub, mul, fma= 1; div, sqrt, sin, cos= 10; log, log1p, sincos= 15; tan= 20。

1个回答

考虑以下泰勒级数展开sin(y)/sin(x)1y=x, : 谢谢 Wolfram!https://www.wolframalpha.com/input/?i=series+sin%28y%29%2Fsin%28x%29+y+%3D+xδ=yx

sin(y)/sin(x)1=δcot(x)12δ216δ3cot(x)+124δ4+1120δ5cot(x)...

这只需要您计算单个三角运算cot(x)和项. 如果您可以准确计算并且很小,那么很容易看出这很快就会收敛。您甚至可以重用值用于后续迭代。δn/n!cot(x)δδn/n!

如果x接近于 0cot(x)是垃圾,那么您可能必须尝试其他方法,也许是 L'Hopital 的规则?

编辑:

一个不太“聪明”的方法是在处考虑以下泰勒级数,其中 对于您的域,介于 1 和 2 之间。只要您能准确计算出,那么它绝不会成为问题。处评估函数也表现得非常好。也许您可以根据需要在两种形式之间切换。x=0y/x=a

sin(ax)/sin(x)=a+12a(1a2)x2+...nasty terms
aax=0