【问题标题】:Math.Pow() vs Math.Exp() C# .NetMath.Pow() 与 Math.Exp() C# .Net
【发布时间】:2013-08-24 09:42:12
【问题描述】:

谁能解释在 C# 和 .net 中使用 Math.Pow()Math.Exp() 之间的区别?

Exp()是否只是将一个数字作为指数来使用?

【问题讨论】:

  • 文档的哪一部分不清楚?我很高兴将您对文档的批评转达给文档经理。
  • 如果您不知道,请参阅以下文档:msdn.microsoft.com/en-us。对“Math.Exp”的简单搜索将带您直接进入解释所有这些的页面。
  • @EricLippert 我在文档中看到的唯一可能的混淆点是它只是说“返回e提升到指定的幂” ,但是对于以前没有遇到过 e 的人来说,可能不清楚它代表什么。也许“返回指定数字的指数”。当然,如果这个人不知道“指数”是什么意思,这并没有多大作用,但它可能会促使进一步研究。
  • 也许是此类研究的资源:@​​987654322@

标签: c# .net algebra pow calculus


【解决方案1】:
Math.Pow(Math.E,n) = Math.Exp(n)  //of course this is not actual code, just a human equation.

更多信息:Math.PowMath.Exp

【讨论】:

  • 虽然你的身份是正确的身份,但它不是身份的有趣版本。有趣的版本是 z 到 w = e 到 (w ln z)。这使我们能够根据 exp 函数及其逆函数定义任意实数(或复数!)幂运算,它们具有简单的定义。
  • @EricLippert 这仅适用于programming,要深入了解它,OP 可能需要进行更多搜索。我什至知道计算它的值的公式,即使现在他们仍然越来越多地找到e数字的最后一位,它需要supercomputer才能找到,对于我们普通电脑来说并不容易,了解它的性质对一些程序员来说很好但不是必须学习的东西(因为他们在代码中很少使用Math,只需使用library:)
  • 查找 e 的数字很简单; e 的公式收敛得非常快。此外,请记住,在 factoradic 基数中,e 的定义是 1 + 1.11111111111111111...,所以如果你想要 e 的第 n 个因数在小数点右侧,我现在可以告诉你它是什么:它是 1,对于任何你想命名的 n!这不需要超级计算机。
【解决方案2】:

Math.Pow 为一些 xy 计算 x y

Math.Exp 为一些 x 计算 e x,其中 eEuler's number

请注意,虽然Math.Pow(Math.E, d) 产生与Math.Exp(d) 相同的结果,但快速基准比较表明Math.Exp 实际上的执行速度大约是Math.Pow 的两倍:

Trial Operations       Pow       Exp
    1       1000 0.0002037 0.0001344 (seconds)
    2     100000 0.0106623 0.0046347 
    3   10000000 1.0892492 0.4677785 

【讨论】:

    【解决方案3】:

    Math.Exp(x) 是 ex。 (见http://en.wikipedia.org/wiki/E_(mathematical_constant)。)

    Math.Pow(a, b) 是一个b

    Math.Pow(Math.E, x)Math.Exp(x) 是相同的,但如果您使用 e 作为基础,则第二个是惯用的。

    【讨论】:

    • 谢谢蒂莫西。我猜这个常数的定义一直在逃避我我还是有点不清楚。
    • @CraigJSte:退后一步,从第一原理中定义取幂。我们将函数 exp(x) 定义为 x 到 n 的无穷级数之和除以 n 从零到无穷大的阶乘。这只需要用 natural 幂进行真正的幂运算,这是明确定义的。函数 log(x) 被定义为逆函数。 pow(x,y) 被定义为 exp(y log(x)),嘿,我们已经定义了只使用整数幂和无限和的实数(和复数!)幂。为方便起见,常数 e 只是 exp(1) 的名称。
    • 其实我现在越来越了解它了,谢谢你的努力。
    【解决方案4】:

    p.s.w.g 对 Benchmark 贡献的快速扩展 -

    我想再看一个比较,相当于 10^x ==> e^(x * ln(10)) 或 {double ln10 = Math.Log(10.0); y = Math.Exp(x * ln10);}

    这是我得到的:

    Operation           Time
    Math.Exp(x)         180 ns (nanoseconds)
    Math.Pow(y, x)      440 ns
    Math.Exp(x*ln10)    160 ns
    
    Times are per 10x calls to Math functions.
    

    我不明白为什么在循环中包含乘法的时间,在进入 Exp() 之前,总是会产生更短的时间,除非此代码中存在错误,或者算法依赖于值?

    程序如下。

    namespace _10X {
        public partial class Form1 : Form {
            int nLoops = 1000000;
            int ix;
    
            // Values - Just to not always use the same number, and to confirm values.
            double[] x = { 0.5, 1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5, 5 };
    
            public Form1() {
                InitializeComponent();
                Proc();
            }
    
            void Proc() {
                double y;
                long t0;
                double t1, t2, t3;
    
                t0 = DateTime.Now.Ticks;
                for (int i = 0; i < nLoops; i++) {
                    for (ix = 0; ix < x.Length; ix++)
                        y = Math.Exp(x[ix]);
                }
                t1 = (double)(DateTime.Now.Ticks - t0) * 1e-7 / (double)nLoops;
    
                t0 = DateTime.Now.Ticks;
                for (int i = 0; i < nLoops; i++) {
                    for (ix = 0; ix < x.Length; ix++)
                        y = Math.Pow(10.0, x[ix]);
                }
                t2 = (double)(DateTime.Now.Ticks - t0) * 1e-7 / (double)nLoops;
    
                double ln10 = Math.Log(10.0);
                t0 = DateTime.Now.Ticks;
                for (int i = 0; i < nLoops; i++) {
                    for (ix = 0; ix < x.Length; ix++)
                        y = Math.Exp(x[ix] * ln10);
                }
                t3 = (double)(DateTime.Now.Ticks - t0) * 1e-7 / (double)nLoops;
    
                textBox1.Text = "t1 = " + t1.ToString("F8") + "\r\nt2 = " + t2.ToString("F8")
                            + "\r\nt3 = " + t3.ToString("F8");
            }
    
            private void btnGo_Click(object sender, EventArgs e) {
                textBox1.Clear();
                Proc();
            }
        }
    }
    

    所以我想我会选择Math.Exp(x * ln10),直到有人发现错误...

    【讨论】:

    • 我为制作整个块 提前道歉。但是我花了将近 1 个小时试图发布这个重复出现的结果,即“您的帖子似乎包含格式不正确的代码”错误消息。每次我尝试某些东西时,错误框指向的行都会更改为其他地方。有时在段落的中间,有时在代码块的不同点。刚开始疼。对不起。
    • 这应该是一个新问题。
    • @TruckeeTinker 如果您有格式问题,请查看stackoverflow.com/editing-help
    • 我认为它确实通过扩展 p.s.w.g. 的贡献对答案做出了贡献。我的目标只是分享表单 Math.Exp(x*ln10) 比 Math.Pow 产生性能优势的经验。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-11
    • 2017-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-30
    相关资源
    最近更新 更多