c语言实现 三角函数,关于数学:快速实现C ++三角函数

博主在寻找比math.h中三角函数更快的实现,以优化数值密集型物理模拟程序。讨论涉及查找表、游戏引擎中的实现、精度与性能权衡,以及使用公式和多边形逼近等技术。评论提供了多种优化建议,包括使用查找表、幂级数逼近、SIMD并行计算等。最终,博主认为对于2%-3%的性能提升是值得研究的,但会先考虑代码的其他优化途径。
摘要由CSDN通过智能技术生成

简短版本:我想知道是否有标准三角函数的实现比math.h中包含的函数更快。

较长的版本:我有一个程序,它非常注重数值(这是物理模拟),并且需要调用三角函数,主要是sin和cos。 当前,我只是在使用math.h中包含的实现。 分析显示,对这些函数的调用花费比我期望的要多(希望)。

虽然在代码的其他部分中肯定有很多优化的余地,但是更快的sin和cos可能会给我带来一些额外的收益。.那么,你们有什么建议吗?

在另一篇文章中,建议使用自制查询表。 但是也许还有其他选择? 还是某些库中的现成且经过良好测试的查找解决方案?

大多数超验者都针对游戏引擎,而游戏引擎并不太在乎准确性。准确性对您的问题有多重要?

首先配置文件。"可能给一些额外的百分比"是不值得尝试优化的。

@pmr:正如我的问题所述,我正在进行概要分析,因此,我的期望是运行时"百分之几"-可能是2%或3%,但这当然是一个非常粗略的估计。但是,如果运行时间只有几天的时间,那么我所能得到的任何百分比也许确实值得。

查找表是1985年的一种形式。现代CPU处理数字的速度比从内存中读取数据快得多。除非您的查询表非常小,并且您要在批处理中进行大量的sin / cos操作,所以您保证LUT处于1级缓存中是不值得的。我见过SSE中的minimax多边形有效运行18-20个周期(流水线化)。这大约是LUT最佳情况的两倍,并且比一般情况要快一些,特别是如果您执行的不是合成基准测试(但是,它不会从其他代码中删除高速缓存行)。

@Marcelo:是的,这最终将是问题。我最终将不得不测试它,我的直觉告诉我,在大多数地方,说4或5位数字的准确性就足够了。

但是,就像前面的评论者已经暗示的那样,您应该首先考虑十几个循环是否有问题。除非您每帧进行数百万次触发函数调用,否则在未使用15年的CPU上应该没问题(如果执行了那么多次,则您可能做错了什么)。

当瓶颈是触发函数时,要考虑的事情是使用三角函数公式来减少调用次数。例如,如果您针对一堆连续的整数n计算sin(nx)和cos(nx),则可能值得计算cos x和sin x并使用递归(cos(a + b)= cos a cos b- sin a sin b和sin(a + b)= sin a cos b + cos a sin b)

参见stackoverflow.com/questions/523531/适用于Java的公式,但公式可在C ++中使用。

math.h不包括任何实现。该实现在将链接到您的代码的库中。要回答您的问题,您必须告诉您所使用的目标CPU和编译器。

我已经在cpu端实现了一个快速的正弦函数,它比math.h的正弦函数至少快两倍,但是我使用了一个很小的查找表(20个浮点数)。它的准确性也不差。平均相对误差率为0.095%。您可以从http://www.hevi.info/tag/fast-sine-function/查看

您是否已经检查过算法是否可并行化?如果您可以使其运行在GPU上(例如,通过openCL),那么您的速度可能会比原来的2%-3%快90%-95%(developer.nvidia.com/opencl)

这是一些有关如何触发三角函数的幂级数逼近的好幻灯片(虽然不是泰勒级数)&#x

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值