11

C# と .net での使用Math.Pow()との違いを説明できる人はいますか?Math.Exp()

Exp()指数として自分自身を使用して、数値をべき乗するだけですか?

4

4 に答える 4

59

Math.Powxyについてx yを計算します。

Math.Expは、いくつかのxについてe xを計算します。ここで、eオイラー数です。

Math.Pow(Math.E, d)は と同じ結果を生成しMath.Exp(d)ますが、ベンチマークを簡単に比較すると、Math.Exp実際には の約 2 倍の速度で実行されることがわかり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 
于 2013-08-21T20:42:21.307 に答える
1

pswg からの 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)だから、誰かがバグを見つけるまで、私は一緒にいると思います...

于 2014-06-12T21:57:49.207 に答える