【发布时间】:2014-08-13 19:51:03
【问题描述】:
我正在处理年金,我的代码中有以下方法:
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.Log?
我认为 Math.Pow 是更好的选择,但希望能提供一些意见。
【问题讨论】:
-
为什么不使用 100,000 次调用来分析每种方法,然后自己看看哪个更快?
-
我希望具有固定基数的
log比pow快,因为pow 通常是通过在基数上调用log来实现的,然后是一个固定的基数求幂函数。如果您进行基准测试,请分别针对 x64 和 x86 进行基准测试,因为在这些平台上生成的浮点代码非常不同。 -
除非这是您的应用程序的瓶颈,否则请使用更易于阅读的版本,而不是更快的版本。
-
我注意到
Term是一个整数。对于整数幂,通常有比 Math.Pow 更快的方法,例如 mindprod.com/jgloss/power.html。只有当这是性能瓶颈时才走这条路线。 -
this post 很好地覆盖了。不,Math.Pow() 并不快。通过 Stopwatch 课程,您可以轻松找到自己。
标签: c# math benchmarking logarithm pow