web-dev-qa-db-fra.com

Math.Pow () vs Math.Exp () C # .Net

Quelqu'un peut-il expliquer la différence entre l'utilisation de Math.Pow() et de Math.Exp() en C # et .net?

Exp()just prend-il un nombre à la puissance en se servant d’exposant?

6
CraigJSte

Math.Pow calcule x   y pour certains x et y .

Math.Exp calcule e   x pour certains x , où e est le numéro d'Euler .

Notez que bien que Math.Pow(Math.E, d) produise le même résultat que Math.Exp(d), une comparaison rapide montre que Math.Exp est en réalité environ deux fois plus rapide que 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 
46
p.s.w.g
Math.Pow(Math.E,n) = Math.Exp(n)  //of course this is not actual code, just a human equation.

Plus d'infos: Math.Pow et Math.Exp

4
King King

Math.Exp(x) est ex. (Voir http://en.wikipedia.org/wiki/E_(mathematical_constant) .)

Math.Pow(a, b) est unb.

Math.Pow(Math.E, x) et Math.Exp(x) sont identiques, bien que le second soit idiomatique à utiliser si vous utilisez e comme base.

4
Timothy Shields

Juste une extension rapide de la contribution de référence de p.s.w.g -

Je voulais voir une autre comparaison, pour un équivalent de 10 ^ x ==> e ^ (x * ln (10)), ou {double ln10 = Math.Log(10.0); y = Math.Exp(x * ln10);}

Voici ce que j'ai

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.

Ce que je ne comprends pas, c'est pourquoi le temps nécessaire pour inclure une multiplication dans la boucle, avant d’entrer dans Exp(), produit systématiquement des temps plus courts, sauf s’il ya un bogue dans ce code ou si l’algorithme dépend de la valeur?

Le programme suit.

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();
        }
    }
}

Donc, je pense que je vais avec Math.Exp(x * ln10) jusqu'à ce que quelqu'un trouve le bogue ...

0
Truckee Tinker