首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在C++中创建正弦查找表

在C++中创建正弦查找表
EN

Stack Overflow用户
提问于 2010-09-10 21:57:09
回答 6查看 45.3K关注 0票数 20

如何在C++中重写下面的伪代码?

代码语言:javascript
运行
AI代码解释
复制
real array sine_table[-1000..1000]
    for x from -1000 to 1000
        sine_table[x] := sine(pi * x / 1000)

我需要创建一个sine_table查找表。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2010-09-10 23:55:01

您可以通过仅存储第一象限的值将表的大小减少到原始的25%,例如,对于x in 0,pi/2。

为此,您的查找例程只需使用简单的trig标识将x的所有值映射到第一个象限:

  • sin(x) =- sin(-x),从象限IV映射到象限I
  • sin(x) = sin(pi - x),从象限II映射到象限I

要从象限III映射到象限I,应用两个身份,即sin(x) =- sin (pi + x)

这种策略是否有帮助取决于您的情况下内存使用量的大小。但是,仅仅为了避免查找过程中的比较和减法而存储四倍于所需的值似乎是浪费的。

我赞同Jeremy的建议,即衡量构建一个表是否比仅仅使用std::sin()更好。即使使用最初的大表,您也必须在每次查找表的过程中花费时间将参数转换为pi/1000的最接近增量,并且在此过程中会损失一些准确性。

如果您真的想用精度来换取速度,那么可以尝试仅使用泰勒级数展开的前几项来近似sin()函数。

  • sin(x) =x- x^3/3!+ x^5/5!...,其中^表示幂和!表示阶乘。

当然,为了提高效率,您应该预先计算阶乘,并利用x的较低幂来计算较高的幂,例如,在计算x^5时使用x^3。

最后一点,上面的截断泰勒级数对于更接近于零的值更准确,因此在计算近似正弦之前,仍然值得映射到第一或第四象限。

附录:基于两个观察结果,还有一个潜在的改进:

如果你能计算第一个八分项中的正弦和余弦,你就可以计算任何三角函数,pi/4

  • ,以零为中心的泰勒级数展开式在零点附近更准确,

因此,如果您决定使用截断的泰勒级数,那么您可以通过映射到正弦或余弦来提高精度(或者使用更少的项来获得范围0,pi/4的角度),除了上面的恒等式之外(例如,如果x> pi/4,则在映射到第一象限后,使用诸如sin(x) = cos(pi/2-x)和cos(x) = sin(pi/2-x)之类的恒等式)。

或者,如果您决定对正弦和余弦都使用表查找,您可以使用两个较小的表,这两个表仅涵盖范围0,pi/4,以牺牲另一个可能的比较和减法查找来映射到较小的范围。然后,您可以为表使用更少的内存,或者使用相同的内存,但提供更精细的粒度和准确性。

票数 35
EN

Stack Overflow用户

发布于 2010-09-10 22:03:52

代码语言:javascript
运行
AI代码解释
复制
long double sine_table[2001];
for (int index = 0; index < 2001; index++)
{
    sine_table[index] = std::sin(PI * (index - 1000) / 1000.0);
}
票数 5
EN

Stack Overflow用户

发布于 2010-09-19 17:37:43

还有一点:调用三角函数是很昂贵的。如果您想要准备具有恒定步长的正弦查找表-您可以节省计算时间,但代价是一些潜在的精度损失。

考虑你的最小步长是"a“。也就是说,你需要sin(a),sin(2a),sin(3a),...

然后,您可以执行以下操作:首先计算sin(a)和cos(a)。然后,对于每个连续的步骤,使用以下三角等式:

  • sin(n+1 * a) = sin(n*a) * cos(a) + cos(n*a) * sin( a)
  • cos(n+1 *a)= cos(n*a) * cos(a) - sin(n*a) * sin(a)

这种方法的缺点是在此过程中会累积舍入误差。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3688649

复制
相关文章
在Excel公式中嵌入查找表
通常,我们会在工作表中放置查找表,然后使用公式在该表中查找相对应的值。然而,这也存在风险,就是用户可能会在删除行时无意识地将查找表中的内容也删除,从而导致查找错误。
fanjy
2023/09/23
4260
在Excel公式中嵌入查找表
Excel实战技巧74: 在工作表中创建搜索框来查找数据
如下图1所示,在数据区域上方放置有一个文本框,用来输入要搜索的文本,其名称重命名为“MySearch”;一个用作按钮的矩形形状,点击它开始搜索并显示结果;两个选项按钮窗体控件,用来选择在数据区域的哪列进行搜索。
fanjy
2020/02/18
17K1
在PowerBI中创建时间表(非日期表)
在powerquery中创建日期表是使用powerbi过程中一个必不可少的内容(当然,你也可以使用DAX来创建):
陈学谦
2020/07/01
4.5K0
在PowerBI中创建时间表(非日期表)
Excel公式技巧94:在不同的工作表中查找数据
很多时候,我们都需要从工作簿中的各工作表中提取数据信息。如果你在给工作表命名时遵循一定的规则,那么可以将VLOOKUP函数与INDIRECT函数结合使用,以从不同的工作表中提取数据。这项技术可以节省时间,提高效率。
fanjy
2021/07/12
13.2K0
在MySQL中创建Oracle中的dept、emp、bonus、salgrade表
Oracle数据库中自带的4张表: dept、emp、bonus和salgrade是练习SQL查询的经典案例表,本文提供在MySQL中建这4张表的SQL语句
CoderJed
2018/09/13
6.8K0
技巧:在磁盘上查找 MySQL 表的大小
我想知道 MySQL 表在磁盘上占用多少空间,但看起来很琐碎。不应该在 INFORMATION_SCHEMA.TABLES 中提供这些信息吗?没那么简单!
jeanron100
2019/09/25
3.2K0
技巧:在磁盘上查找 MySQL 表的大小
在Python中实现线性查找
线性查找算法是最简单的查找算法之一。线性查找算法的输入是一个数组或列表和项,该算法查找数组中是否存在该项。如果找到该项,则返回其索引;否则,可以返回null或你认为在数组中不存在的任何其他值。
fanjy
2022/11/16
3.3K0
在Python中实现线性查找
查找三 哈希表的查找
静默虚空
2018/01/05
1.5K0
查找三 哈希表的查找
数据库中创建表的语句_创建基本表学生表的sql语句
在线Sqlite查看器|修改器 http://lzltool.com/sqlite-viewer
全栈程序员站长
2022/11/02
5.1K0
【数字信号处理】相关函数应用 ( 正弦信号 的 自相关函数 分析 | 在白噪声中检测正弦信号 )
文章目录 一、正弦信号 的 自相关函数 分析 一、正弦信号 的 自相关函数 分析 ---- 正弦信号 A \sin \omega n , 其 幅度 A = 1 , 功率 P_s = 0.5 , 下图是该正弦信号的函数图 : 白噪声信号 N(n) , 方差 1 , 信噪比 \rm SNR = -3dB , 信号长度为 512 ; 下图是 正弦信号 s(n) = A \sin \omega n 与 白噪声信号 N(n) 叠加后的 函数图 : 从上图中 , 基本看不
韩曙亮
2023/03/30
1.9K0
【数字信号处理】相关函数应用 ( 正弦信号 的 自相关函数 分析 | 在白噪声中检测正弦信号 )
【数字信号处理】相关函数应用 ( 正弦信号 的 自相关函数 分析 二 | 在白噪声中检测正弦信号 )
从上图中 , 可以大概分辨出信号 , 比上一篇博客 【数字信号处理】相关函数应用 ( 正弦信号 的 自相关函数 分析 | 在白噪声中检测正弦信号 ) 中 , 叠加后的信号 明显很多 , 下图是上一篇博客中叠加后的信号 :
韩曙亮
2023/03/30
1.4K0
【数字信号处理】相关函数应用 ( 正弦信号 的 自相关函数 分析 二 | 在白噪声中检测正弦信号 )
在排序数组中查找数字
思路: 2分查找数组中的第一个k: 1. 如果中间数字大于k,那么k只可能出现在前半段 2. 如果中间数字小于k,那么k只可能出现在后半段 3. 如果中间数字等于k: - 如果中间数字的前面不是k,那么中间数字恰好就是第一个k - 如果中间数字的前面是k,那么第一个k肯定在前半段
用户8639654
2021/07/23
3.9K0
在MySQL中查找重复记录
I want to pull out duplicate records in a MySQL Database. 我想在MySQL数据库中提取重复记录。 This can be done with: 这可以通过以下方式完成:
kirin
2021/04/30
4K0
在nodejs中创建cluster
在前面的文章中,我们讲到了可以通过worker_threads来创建新的线程,可以使用child_process来创建新的子进程。本文将会介绍如何创建nodejs的集群cluster。
用户2323866
2021/06/22
3.5K0
在nodejs中创建cluster
在前面的文章中,我们讲到了可以通过worker_threads来创建新的线程,可以使用child_process来创建新的子进程。本文将会介绍如何创建nodejs的集群cluster。
程序那些事
2021/01/28
3.4K0
Rdfind - 在Linux中查找重复文件
前段时间遇到一个问题,服务器下面一个文件夹下面的图片越来越多,由原来的5G,达到了现在的94G,其中这个文件夹下面有好多重复的图片,文件多了之后造成图片备份困难,图片迁移困难,浪费了大量的空间和IO。
kubernetes中文社区
2019/06/24
5.5K0
查找——线性表
查找概率不等时,如果从前向后查找,则按查找概率由大到小排列的有序表其ASL要比无序表ASL小
ruochen
2021/06/29
5690
查找——线性表
9.3 动态查找表
(1)和次优二叉树相对,二叉排序树是一种动态树表。其特点是,树点的结构通常不是一次生成的,而是在查找过程中,当树中不存在关键字等于给定值的结点时再进行插入。
小林C语言
2020/12/13
5750
9.3 动态查找表
OushuDB 创建和管理外部表(中)
创建一个外部表,使用CREATE EXTERNAL TABLE命令。在这个命令里,需声明新表名称,各列名称及其数据类型,基于命令的EXECUTE子句或基于URL的LOCATION子句的外部数据来源,数据格式。
用户7454708
2023/05/08
4470
OushuDB 创建和管理外部表(中)
查找一 线性表的查找
静默虚空
2018/01/05
1K0
查找一 线性表的查找

相似问题

在Java中查找正弦

65

在c++中查找角度的正弦值和余弦值

50

为正弦值性能计算还是查找表?

76

如何用不动点算法在正弦查找表中查找偏移量

11

Doom如何从现有的正弦查找表确定其余弦查找表?

226
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档