一次性计算正弦和余弦

2024-03-07

我有一个科学代码,它使用同一参数的正弦和余弦(我基本上需要该参数的复指数)。我想知道是否可以比分别调用正弦和余弦函数更快。

而且我只需要大约 0.1% 的精度。那么有什么方法可以找到默认的三角函数并截断幂级数以提高速度?

我想到的另一件事是,有没有办法执行余数运算,使结果始终为正?在我自己的算法中我使用了x=fmod(x,2*pi);但如果 x 为负数,我需要添加 2pi (较小的域意味着我可以使用较短的幂级数)

编辑:LUT 被证明是最好的方法,但是我很高兴我了解了其他近似技术。我还建议使用明确的中点近似。这就是我最终所做的:

const int N = 10000;//about 3e-4 error for 1000//3e-5 for 10 000//3e-6 for 100 000
double *cs = new double[N];
double *sn = new double[N];
for(int i  =0;i<N;i++){
    double A= (i+0.5)*2*pi/N;
    cs[i]=cos(A);
    sn[i]=sin(A);
}

以下部分近似(中点)sin cos(2*pi*(wc2+tj]*(corp*tj]-wc)))

double A=(wc2+t[j]*(cotp*t[j]-wc));
int B =(int)N*(A-floor(A));
re += cs[B]*f[j];
im += sn[B]*f[j];

另一种方法可能是使用切比雪夫分解。您可以使用正交性属性来查找系数。针对指数优化,它看起来像这样:

double fastsin(double x){
    x=x-floor(x/2/pi)*2*pi-pi;//this line can be improved, both inside this 
                              //function and before you input it into the function

    double x2 = x*x;
    return (((0.00015025063885163012*x2- 
   0.008034350857376128)*x2+ 0.1659789684145034)*x2-0.9995812174943602)*x;} //7th order chebyshev approx

如果您寻求使用幂级数以良好(但不高)精度进行快速评估,您应该使用切比雪夫多项式的扩展:将系数制成表格(您需要非常少的系数才能达到 0.1% 的精度)并使用这些多项式的递归关系评估扩展(这真的很容易)。

参考:

  1. 系数列表:http://www.ams.org/mcom/1980-34-149/S0025-5718-1980-0551302-5/S0025-5718-1980-0551302-5.pdf http://www.ams.org/mcom/1980-34-149/S0025-5718-1980-0551302-5/S0025-5718-1980-0551302-5.pdf
  2. 切比雪夫展开式的评估:https://en.wikipedia.org/wiki/Chebyshev_polynomials https://en.wikipedia.org/wiki/Chebyshev_polynomials

您需要 (a) 获得 -pi/2..+pi/2 范围内的“简化”参数,然后 (b) 当参数实际上应该位于“其他”中时,处理结果中的符号" 完整基本区间的一半 -pi..+pi。这些方面不应构成主要问题:

  1. 确定(并“记住”为整数 1 或 -1)原始角度的符号并继续计算绝对值。
  2. 使用模函数减少到区间 0..2PI
  3. 确定(并“记住”为整数 1 或 -1)它是否在“后”半部分,如果是,则减去 pi*3/2,否则减去 pi/2。注意:这有效地互换了正弦和余弦(符号除外);在最终评估中考虑到这一点。

这样就完成了获取 -pi/2..+pi/2 角度的步骤 使用 Cheb 展开式评估正弦和余弦后,应用上面步骤 1 和 3 的“标志”以获得值中的正确符号。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

一次性计算正弦和余弦 的相关文章

随机推荐

  • 流媒体 YouTube 视频

    我正在编写一个使用流媒体播放 YouTube 视频的应用程序 第一种方法 我正在使用 GData API 获取视频的 RTSP URL 这是播放 RTSP url 的代码 VideoView mVideoView new VideoView
  • 模式中的表单输入未按要求显示

    我已经阅读了一些相关文章 但没有成功解决我自己的让表单字段按要求显示的问题 也许问题出在外面 但我想分享一下 以防它突出一个独特的案例 这是一个可以完整查看的课堂作业here https futurethang github io Trai
  • Angular 5,具有 3 种状态的 Angular Material 复选框(选中、未选中、不确定)

    我是 Angular 和 Angular Material 的新手 现在我在一些项目中担任支持人员 有一个带有过滤器和一个复选框的网格 用于检查网格中的用户是否处于活动状态 非活动状态或未选择状态 如果只有两个选项 活动 非活动 会更简单
  • 媒体查询最大宽度与视图端口大小或窗口大小有关?

    我想知道媒体查询的最大宽度是否与视图端口大小或窗口大小有关 例如 我有这个媒体查询 media screen and max width 360px 当视口大小为 360px 或窗口大小为 360px 时 此媒体查询会起作用吗 这是视口 这
  • 使用 preg_replace 替换 php 中出现的所有内容

    正则表达式绝对是我的弱点 这个让我完全难住了 我正在构建一个相当基本的搜索功能 我需要能够根据以下模式更改用户输入 Subject 22first set 22 22second set 22 drupal wordpress 期望的输出
  • Selenium 2.42.2 webdriver 与 Firefox 27.0.1 兼容吗? [复制]

    这个问题在这里已经有答案了 Selenium 2 42 2 webdriver 与 Firefox 27 0 1 兼容吗 如果不兼容 那么它与哪个 Firefox 版本兼容 我正在使用 Selenium 2 42 2 网络驱动程序 我写的测
  • memcached 使用 Django 监听 UDP

    Question 我无法获得memcached正在听UDP 上班 get set delete 与姜戈 我只让 memcached 监听UDP 11211 正如我在上一个问题 https stackoverflow com question
  • 具有 Enum 类型属性的 WPF 用户控件

    我有一个UserControl called InputSensitiveTextBox继承自TextBox 它有一个我定义的属性CurrentInputType 其类型为MyControlsNamespace SupportedInput
  • 如何:旋转选定/设置的图像 (Flutter)

    从图像选择器 画廊 相机 中选择图像后 我成功地将图像旋转为横向 纵向 这工作正常 并将继续将新图像设置为我想要的方向 但是 我尝试使用相同的方法来旋转已选择 设置的图像 但它不起作用 这是我正在使用的逻辑 import package i
  • SASS/SCSS @import 前面的 ~ 是什么意思/做什么?

    我在 GitHub 上被告知开始使用 在我的 SASS SCSS 之前 import路径 试图用谷歌搜索但找不到正确的答案 我想这太新手了 甚至懒得写 但我想学习它 它指的是node modules目录 或其等效目录 例如 在 Angula
  • 如何获取 Zune 中定义的设备名称?

    在 Zune 中 可以通过 Zune gt 设置 gt 手机 gt 同步选项更改手机名称 例如 我将手机名称更改为 myphone lumia 900 我怎样才能得到这个名字 使用DeviceStatus DeviceName它仅返回型号
  • Python IDLE 无法打开文件,显示“打开文件操作无法连接到打开和保存面板服务”

    刚刚升级到带有 m1 pro 芯片的新 MBP 我在尝试通过 IDLE 打开文件时遇到一些奇怪的问题 它抛出一个错误 说 打开文件操作无法连接到打开和保存面板服务 我尝试重新安装python 当在IDLE的服务设置下查看时 我找不到这样的服
  • 如何重命名 android-debug.apk

    我正在使用 Cordova 5 1 1 和 ionic 框架来创建我的 android 但是 当我尝试构建 apk 时 为什么文件名始终是 android debug apk 有什么办法可以重命名吗 cordova 创建 hello com
  • 如何在每个页面的侧边栏中包含目录树

    我正在 Sphinx 中生成 html 文档 如何修改文档中每个 html 页面的侧边栏 以便它们包含目录树 默认情况下 目录树似乎只显示在master doc页面 并且仅在主区域而不是侧边栏 是否有捷径可寻 我将使用 readthedoc
  • Android studio 3.1 每次重建工程即可看到变化

    将我的 android studio 更新到版本 3 1 后 我遇到了一个问题 当我对代码进行一些更改时 然后启动执行 我会得到旧的代码执行 直到我重建项目或清理它并重试 那是问题吗 PS 这发生在我的旧项目中 我还没有尝试过新项目 我认为
  • scipy 中的修剪树状图(层次聚类)

    我有一个大约有 5000 个条目的距离矩阵 并使用 scipy 的层次聚类方法对矩阵进行聚类 我为此使用的代码是以下片段 Y fastcluster linkage D method centroid D distance matrix Z
  • git,在保留历史记录的同时移动/重命名文件的可靠方法

    我知道有 很多 现有问题看起来很相似 所以让我在问我的问题之前总结一下它们 答案是是否可以在 git 中移动 重命名文件并保留其历史记录 https stackoverflow com questions 2314652 is it pos
  • 使用 css 防止或禁用 div 中的自动图像调整大小(使用 bootstrap)

    我正在尝试显示图像的原始大小 通常它比包含它的 div 的宽度更大 在现代浏览器中 它会自动调整大小以适合父 div 即使当我使用overflow auto图像仍然会调整大小 那么 当外部 div 具有设定宽度时 如何防止图像大小调整呢 谢
  • 使用 MSBuild 和 CruiseControl .NET 构建和部署 VS2010 数据库项目

    我几乎拥有一个 NAnt 脚本来构建和部署 VS2010 数据库项目 但有一个错误阻碍了我 C Program Files x86 MSBuild Microsoft VisualStudio v10 0 TeamData Microsof
  • 一次性计算正弦和余弦

    我有一个科学代码 它使用同一参数的正弦和余弦 我基本上需要该参数的复指数 我想知道是否可以比分别调用正弦和余弦函数更快 而且我只需要大约 0 1 的精度 那么有什么方法可以找到默认的三角函数并截断幂级数以提高速度 我想到的另一件事是 有没有