Comparing Math.Log and Math.Pow

本文关键字:Math Pow and Log Comparing | 更新日期: 2023-09-27 18:17:57

我正在使用年金,在我的代码中有以下方法:

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.Log更快/更有效?
我假设数学。Pow是更好的选择,但是需要一些输入。

Comparing Math.Log and Math.Pow

我已经按照@Mangist的建议构建了一个基准测试。代码张贴在下面。@CodesInChaos的回应让我很惊讶。当然,我做了一些研究,并意识到我可以改进我的大量代码。我将发布一个链接,链接到我在StackOverflow上找到的一篇关于这方面的有趣文章。许多人在数学上取得了进步。由于上述事实。

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

        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框架中实现的?

让我在上面链接的建议和数学之间添加一个头对头的比较。战俘的功能。我用以下代码对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.9469945Math.Exp (y * Math.Log (x)) 00:00:18.3478346