[英]An efficient way to implement power function: Why Math.Exp(x * Math.Log(n)) is faster than Math.Pow()?
[英]Comparing Math.Log and Math.Pow
我正在使用年金,並在我的代碼中使用以下方法:
public static double NumPMTsRemaining( double CurBalance, double ContractRate, double Pmt)
{
double rt = PeriodicRate(ContractRate);
return -1 * Math.Log(1 - (CurBalance * (rt) / Pmt)) / Math.Log(1 + (rt));
}
public static double MonthlyPMT(double OrigBalance, double ContractRate, int Term)
{
double rt = PeriodicRate(ContractRate);
if (ContractRate > 0)
return (OrigBalance * rt * Math.Pow(1 + rt, Term)) / (Math.Pow(1 + rt, Term) - 1);
else return OrigBalance / Term;
}
我使用前一種方法來確定貸款的支付是否能確保貸款在剩余的生命中得到回報。 我使用后一種方法來確定是否在月度以外的付款期間報價,然后將其替換為每月付款(如果是)。 經過反思,我可以將后一種方法用於這兩項任務。
考慮到這一點,我想知道如果Math.Pow比Math.Log更快/更有效,是否有人知道他們的頭腦?
我認為Math.Pow是更好的選擇,但會欣賞一點輸入。
我建立了@Mangist推薦的基准。 代碼發布在下面。 我對@CodesInChaos的回應感到驚訝。 當然,我做了一些研究,並意識到我可以改進大量的代碼。 我將發布一個鏈接到我在這方面發現的有趣的StackOverflow文章。 由於上述事實,許多人已經對Math.Pow進行了改進。
再次感謝您的建議和信息。
int term = 72;
double contractRate = 2.74 / 1200;
double balance = 20203.66;
double pmt = 304.96;
double logarithm = 0;
double power = 0;
DateTime BeginLog = DateTime.UtcNow;
for (int i = 0; i < 100000000; i++)
{
logarithm=(-1*Math.Log(1-(balance*contractRate/pmt))/Math.Log(1+contractRate));
}
DateTime EndLog = DateTime.UtcNow;
Console.WriteLine("Elapsed time= " + (EndLog - BeginLog));
Console.ReadLine();
DateTime BeginPow = DateTime.UtcNow;
for (int i = 0; i < 100000000; i++)
{
power = (balance * contractRate * Math.Pow(1 + contractRate, term)) / (Math.Pow(1
+ contractRate, term) - 1);
}
DateTime EndPow = DateTime.UtcNow;
Console.WriteLine("Elapsed time= " + (EndPow - BeginPow));
Console.ReadLine();
基准測試的結果是對數的經過時間00:00:04.9274927電力的經過時間00:00:11.6981697
我還提到了一些額外的StackOverflow討論,這些討論揭示了@CodeInChaos的評論。
Math.Pow()是如何在.NET Framework中實現的?
讓我在上面的鏈接和Math.Pow函數之間添加一個頭對頭的比較。 我使用以下代碼對Math.Pow(x,y)與Math.Exp(y * Math.Log(x))進行基准測試:
DateTime PowBeginTime = DateTime.UtcNow;
for (int i = 0; i < 250000000; i++)
{
Math.Pow(1 + contractRate, term);
}
DateTime PowEndTime = DateTime.UtcNow;
Console.WriteLine("Elapsed time= " + (PowEndTime - PowBeginTime));
Console.ReadLine();
DateTime HighSchoolBeginTime = DateTime.UtcNow;
for (int i = 0; i < 250000000; i++)
{
Math.Exp(term * Math.Log(1 + contractRate));
}
DateTime HighSchoolEndTime = DateTime.UtcNow;
Console.WriteLine("Elapsed time= " + (HighSchoolEndTime - HighSchoolBeginTime));
Console.ReadLine();
結果是:Math.Pow(x,y)00:00:19.9469945 Math.Exp(y * Math.Log(x))00:00:18.3478346
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.