首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Math.Log与Math.Pow的比较

Math.Log与Math.Pow的比较
EN

Stack Overflow用户
提问于 2014-08-13 19:51:03
回答 1查看 936关注 0票数 3

我正在处理养老金问题,代码中有以下方法:

代码语言:javascript
复制
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是更好的选择,但希望得到一些输入。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-08-13 21:56:43

我已经按照@Mangist的建议构建了一个基准。代码张贴在下面。我对@CodesInChaos的回复感到惊讶。当然,我做了一些研究,并意识到我可以改进我的大量代码。我将发布一个链接到我在这方面发现的一篇有趣的StackOverflow文章。由于上述事实,许多人已经对Math.Pow进行了改进。

再次感谢您的建议和信息。

代码语言:javascript
复制
        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的评论。

How is Math.Pow() implemented in .NET Framework?

让我在上面的链接和Math.Pow函数之间添加一个头对头的比较。我用以下代码对Math.Pow(x,y)和Math.Exp(y*Math.Log(x))进行了基准测试:

代码语言:javascript
复制
        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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25294937

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档