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

皮特克

我过去一个小时一直在搜索这个问题,但是泰勒级数或一些示例代码要么太慢,要么根本没有编译。好吧,我在Google上找到的大多数答案是“ Google it,已经被问到了”,但可悲的是,事实并非如此……

我在低端奔腾4上对游戏进行了性能分析,发现大约85%的执行时间被浪费在计算窦,余弦和平方根上(来自Visual Studio中的标准C ++库),并且这似乎很大程度上取决于CPU(在我的I7同样功能只得到了5%的执行时间,而游戏是waaaaaaaaaay更快)。我无法优化这三个函数,也无法一次计算正弦和余弦(相互依赖),但是我的模拟并不需要太精确的结果,因此我可以使用更快的近似值。

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

EDIT查找表更加麻烦,因为在现代CPU上导致的Cache Miss比Taylor系列要昂贵得多。这些天的CPU太快了,而缓存却没有。

我犯了一个错误,尽管我需要为泰勒级数计算几个阶乘,但现在我可以将它们实现为常量。

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

编辑2

我正在使用平方根来计算距离,而不是归一化-无法使用快速反平方根算法(如注释中所指出:http : //en.wikipedia.org/wiki/Fast_inverse_square_root

编辑3

我也无法在平方距离上进行运算,我需要精确的距离才能进行计算

济慈

最快的方法是使用此示例中的表来预先计算值:

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

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

正弦泰勒级数

有关泰勒系列的更多信息,请访问http://en.wikipedia.org/wiki/Taylor_series

使此功能正常运行的关键之一是预先计算阶乘并以合理数量的项进行截断。阶乘在分母中的增长非常快,因此您不需要携带多个术语。

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

TOP 榜单

热门标签

归档