我正在使用年金,并且我的代码中包含以下方法:
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的注释更加清晰。
.NET Framework中如何实现Math.Pow()?
让我在上面链接的建议和Math.Pow函数之间进行正面对比。我使用以下代码对Math.Exp(y * Math.Log(x))进行了Math.Pow(x,y)基准测试:
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
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句