C#と.netでのMath.Pow()
とMath.Exp()
の違いの説明を誰かが提供できますか?
Exp()
は、指数としてそれ自体を使用して、Powerに数値を取りますか?
_Math.Pow
_ 計算x y 一部のxおよびyの場合。
_Math.Exp
_ 計算e x 一部のxの場合、eは オイラーの数 。
Math.Pow(Math.E, d)
はMath.Exp(d)
と同じ結果を生成しますが、簡単なベンチマーク比較により、_Math.Exp
_は実際には_Math.Pow
_の約2倍の速度で実行されることがわかります。
_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)
はeバツ。 ( http://en.wikipedia.org/wiki/E_(mathematical_constant) を参照してください。)
Math.Pow(a, b)
はb。
Math.Pow(Math.E, x)
とMath.Exp(x)
は同じですが、2番目はeをベースとして使用している場合に使用する慣用的なものです。
P.s.w.gからのベンチマークの貢献に対する簡単な拡張-
10 ^ x ==> e ^(x * ln(10))、または{double ln10 = Math.Log(10.0); y = Math.Exp(x * ln10);}
に相当する、もう1つの比較を見たい
ここに私が持っているものがあります:
_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)
を使うつもりだと思います...