首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么Math.Pow(x,2)没有优化到x*x,既不是编译器也不是JIT?

为什么Math.Pow(x,2)没有优化到x*x,既不是编译器也不是JIT?
EN

Stack Overflow用户
提问于 2012-09-22 18:03:39
回答 2查看 1.6K关注 0票数 8

我在几个开源项目中遇到过非优化代码,因为程序员不考虑他们使用的是什么。

由于Math.Pow在内部使用Exp和Ln函数,因此两种情况之间的性能差异高达10倍,这是如何解释in this answer的。

在大多数情况下,通常的乘法比加电要好(功率小),但最好的当然是Exponentation by squaring algorithm

因此,我认为编译器或JITter必须使用powers和其他函数来执行这种优化。为什么还没有推出呢?我说的对吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-09-22 18:14:34

再读一遍你引用的答案,它清楚地说明CRT使用的是微软从英特尔购买的pow()函数。您看到的使用Math.LogMath.Exp的示例是本文作者在一本编程书籍中找到的示例。

通用求幂方法的“问题”在于,它们被构建为在所有情况下都能产生最准确的结果。在某些情况下,这通常会导致性能不佳。为了提高这些特定情况下的性能,必须添加条件逻辑,这会导致所有情况下的性能损失。因为在没有Math.Pow方法的情况下,平方或立方化值非常容易编写,所以没有必要优化这些情况,并为所有其他情况承担额外的损失。

票数 7
EN

Stack Overflow用户

发布于 2012-09-22 19:37:34

我会说这不是一个好主意,因为这两种方法每次都不会返回相同的结果。

下面是一个小的测试脚本

代码语言:javascript
复制
        var r = new Random();

        var any = Enumerable.Range(0, 1000).AsParallel().All(p =>
            {
                var d = r.NextDouble();

                var pow = Math.Pow(d, 2.0);
                var sqr = d * d;

                var identical = pow == sqr;
                if (!identical)
                    MessageBox.Show(d.ToString());

                    return identical;
            });

这两种实现的准确性各不相同。如果进行了可靠的计算,它应该是可重现的。例如,如果只是在发布实现中使用平方优化,那么调试和发布版本将返回不同的解决方案。这对于错误调试来说可能是相当混乱的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12542802

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档