我在谷歌上搜索了过去一个小时的问题,但只有泰勒级数或一些示例代码太慢或根本无法编译。好吧,我在谷歌上找到的大多数答案是“谷歌它,它已经被问过了”,但遗憾 的是它不是……
我在低端 Pentium 4 上分析我的游戏,发现大约 85% 的执行时间浪费在计算正弦、余弦和平方根(来自 Visual Studio 中的标准 C++ 库),这似乎严重依赖 CPU(在我的 I7 上,相同的功能只获得了 5% 的执行时间,而且游戏速度 _更快_)。我不能优化这三个函数,也不能一次计算正弦和余弦(相互依赖),但我的模拟不需要太准确的结果,所以我可以接受更快的近似。
所以,问题是:在 C++ 中计算浮点数的正弦、余弦和平方根的最快方法是什么?
编辑 查找表更痛苦,因为在现代 CPU 上产生的 Cache Miss 比泰勒级数更昂贵。这些天 CPU 的速度实在是太快了,而缓存却不是。
我犯了一个错误,虽然我需要计算泰勒级数的几个阶乘,现在我看到它们可以实现为常数。
所以更新的问题:平方根是否也有任何快速优化?
编辑2
我正在使用平方根来计算距离,而不是归一化 - 不能使用快速逆平方根算法(如评论中所指出的: http ://en.wikipedia.org/wiki/Fast_inverse_square_root
编辑3
我也不能对平方距离进行操作,我需要精确的距离进行计算
原文由 PiotrK 发布,翻译遵循 CC BY-SA 4.0 许可协议
最快的方法是预先计算值并使用此示例中的表:
在 C++ 中创建正弦查找表
但是,如果您坚持在运行时计算,您可以使用正弦或余弦的泰勒级数展开…
有关泰勒系列的更多信息… http://en.wikipedia.org/wiki/Taylor_series
使其正常工作的关键之一是预先计算阶乘并截断合理数量的项。阶乘在分母中的增长非常快,因此您不需要携带多个项。
另外…不要每次都从一开始就将您的 x^n 相乘…例如,将 x^3 乘以 x 再乘以两次,然后再乘以两次以计算指数。