首页 > 解决方案 > 为等距角快速准确地迭代生成正弦和余弦

问题描述

在某些应用中,需要多个角度的正弦和余弦,其中角度是通过重复将相等大小的增量incr添加到起始值base来得出的。出于性能原因,不是为每个生成的角度调用sin()标准cos()数学库函数(或可能是非标准函数),只计算一次sin(base)cos(base)sincos()会非常有利,然后导出所有其他的通过应用角度和公式的正弦和余弦:

sin(base+incr) = cos(incr) · sin(base) + sin(incr) · cos(base)
cos(base+incr) = cos(incr) · cos(base) - sin(incr) · sin(根据)

无论执行多少次迭代,这只需要对比例因子sin(incr)cos(incr)进行一次预计算。

这种方法有几个问题。如果增量很小,则cos(incr)将是一个接近 1 的数字,从而在以有限精度浮点格式计算时通过隐式减法抵消导致精度损失。此外,由于计算没有以有利的数值形式sin(base+incr) = sin(base) + adjust排列,因此会产生不必要的舍入误差,其中计算出的量adjust在幅度上明显小于sin(base) (类似于余弦)。

由于通常会应用数十到数百个迭代步骤,因此这些错误会累积。如何以最有利于保持高精度的方式构建迭代计算?如果融合乘加运算 (FMA) 可用(通过标准数学函数fma()fmaf()?

标签: calgorithmfloating-pointtrigonometry

解决方案



推荐阅读