c++ - C++ 中正弦、余弦和平方根的最快实现(不需要非常准确)

标签 c++ math optimization trigonometry

我在谷歌上搜索了过去一个小时的问题,但只有泰勒级数或一些示例代码太慢或根本无法编译。好吧,我在谷歌上找到的大多数答案是“谷歌它,它已经被问过了”,但遗憾的是它不是......

我正在低端 Pentium 4 上分析我的游戏,发现大约 85% 的执行时间浪费在计算正弦、余弦和平方根(来自 Visual Studio 中的标准 C++ 库)上,这似乎严重依赖于 CPU(在我的 I7 上,相同的函数只有 5% 的执行时间,而且游戏速度更快)。我不能优化这三个函数,也不能一次计算正弦和余弦(相互依赖),但我的模拟不需要太准确的结果,所以我可以接受更快的近似值。

那么,问题是:在 C++ 中计算浮点数的正弦、余弦和平方根的最快方法是什么?

编辑
查找表更痛苦,因为在现代 CPU 上产生的缓存未命中比泰勒级数要昂贵得多。这些天 CPU 的速度是如此之快,而缓存则不然。

我犯了一个错误,我认为我需要为泰勒级数计算几个阶乘,现在我看到它们可以作为常量实现。

所以更新的问题是:是否也有平方根的快速优化?

编辑2

我使用平方根来计算距离,而不是归一化 - 不能使用快速逆平方根算法(如评论中指出的:http://en.wikipedia.org/wiki/Fast_inverse_square_root

编辑3

我也不能对平方距离进行运算,我需要精确的距离进行计算

最佳答案

最快的方法是预先计算值并使用如下例中的表格:

Create sine lookup table in C++

但是,如果您坚持在运行时进行计算,则可以使用正弦或余弦的泰勒级数展开...

Taylor Series of sine

有关泰勒级数的更多信息... http://en.wikipedia.org/wiki/Taylor_series

使其正常工作的关键之一是预先计算阶乘并截断合理数量的项。阶乘在分母中的增长非常快,因此您不需要携带多个项。

另外......不要每次都从一开始就乘以你的 x^n ......例如将 x^3 再乘以 x 两次,然后再乘以两次以计算指数。

关于c++ - C++ 中正弦、余弦和平方根的最快实现(不需要非常准确),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18662261/

相关文章:

c++ - 强制编译器不优化无副作用的语句

c++ - 固定 z 轴上的简单线平面相交?

c++ - 高效解析FIX消息c++

c++ - 将 typedef 与原始指针与 shared_ptr 结合使用

c++ - glLightfv GL_POSITION GL_LINEAR_ATTENUATION glsl OpenGL3 或 OpenGL4(位置光)

matlab - Matlab 中的卷积实践

flash - 如何反转音量 slider 的音量数学?

optimization - Logtalk方法调用性能优化

python - 基于语言测试的阿拉伯语句子过滤列表 : Why so slow?

c++ - 使 C++ 变量成为 const