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?
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
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.
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 ...