c - 为等距角快速准确地迭代生成正弦和余弦
问题描述
在某些应用中,需要多个角度的正弦和余弦,其中角度是通过重复将相等大小的增量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()
?
解决方案
推荐阅读
- c# - 寻找与 String Contains 方法相反的方法
- mysql - 从mysql 5.7中的变量将多行插入表中
- python - Python中的PreOrder树遍历
- python - 如何让 python 为我的程序播放来自 youtube vid 的音频?
- c# - 当有多个消息时,C# 套接字服务器会丢弃一些数据
- matlab - 将 EEG 信号分成频段
- python - 默认参数加上条件作为 Python 中的多态性,一个好习惯吗?
- python - 如何使用 Python 使用 Web Scraping 获取数据
- python - 使用 Python 从 DB2 导出数据
- javascript - 使用 JavaScript 录制网络摄像头视频