模量(浮动)与分支



给定两个做相同事情的表达式([-3.14, 3.14] -> [0, 6.28](:

a > 0? a : a + 6.28

fmod(a + 6.28, 6.28)

这两者在表现上有普遍的区别吗?

编辑:假设这样的表达式被调用多次(这样性能是相关的(,并且每次输入的a都不同。(为了更直接地回答问题(。

// Tertiary
t = a > 0? a : a + 6.28
// vs fmod
m = fmod(a + 6.28, 6.28)

两者在性能上有普遍的区别吗?

当然,评测是最好的@NathanOlive,但作为一般指南,请考虑优化潜力。

编译器通常会在a的整个类型范围内进行优化,而不是[3.14,3.14]。t是一个简单的计算,很容易进行优化。

此外,根据FLT_EVAL_METHOD,在C中,m计算被强制为double,当然还有一个函数调用。更多的限制意味着更少的优化可能性。CCD_ 7可以使用最佳FP宽度。

推荐a > 0 ? a : a + 6.28作为一般首选方法。


给定两个做相同事情的表达式

但它们在域[-3.14, 3.14]上做而不是做同样的事情

所有double中约有1/4在[0…1.0]范围内。m使用a + 6.28将损失至少3到所有位的精度。优势:t

范围不同:
t的范围是[0,6.28]
m的范围是[0],6.28(,而不是[0,6.2 8]


关于更高目标的考虑

很明显,代码正在尝试三角范围缩小。要做好这件事比基本正弦更难。余弦,正切计算本身。关于庞大的争论,请参见争论减少:非常好。

如果代码以度数而不是弧度开始,请首先考虑以度数减少范围的优点。


更大的图片

根据a的派生方式或tm的使用方式,甚至可以提出更好的性能想法。因此,如果性能真的是一个问题,那么就需要周围的代码,否则我们会错误地进行微观优化。

相关内容

  • 没有找到相关文章

最新更新