比较Math.Log和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的注释更加清晰。

.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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

charAt()和Math.pow()

来自分类Dev

如何使用Math.PI和Math.pow

来自分类Dev

使用Math.pow()函数

来自分类Dev

Math.pow的JavaScript实现

来自分类Dev

使用Math.Pow函数

来自分类Dev

inputVal上的Math.pow()

来自分类Dev

Java Math.abs与Math.pow

来自分类Dev

numpy.power()和math.pow()给出的结果不同

来自分类Dev

如何用Math.pow或Math.log描述方法的Big O表示法?

来自分类Dev

将Math.Pow投射为浮动

来自分类Dev

Java Math.pow无法正常工作

来自分类Dev

不确定如何使用Math.pow()

来自分类Dev

Java的Math.pow返回1错误

来自分类Dev

Java:Math.pow()返回零

来自分类Dev

Java Math.pow无法正常工作

来自分类Dev

不确定如何使用Math.pow()

来自分类Dev

在SymPy中用Math.pow替换**

来自分类Dev

使用 Math.Pow 计算每月贷款

来自分类Dev

如何使用 Math.pow 计算 bmi

来自分类Dev

Math.Pow()与Math.Exp()C#.Net

来自分类Dev

Java Math.pow(x,2.0)与Math.pow(x,2.0000001)性能

来自分类Dev

Java到Swift-如何在Xcode 6中使用math.pow和math.exp

来自分类Dev

Python中的幂运算-我应该更喜欢**运算符,而不是math.pow和math.sqrt吗?

来自分类Dev

ECMAScript 2016幂运算符和Math.pow()之间的区别

来自分类Dev

Math.Pow(等等)如何实际工作

来自分类Dev

python x。** y与math.pow(x,y)的指数

来自分类Dev

Java的Math.pow是否将结果取整?

来自分类Dev

Math.Pow()的强大功能是否比if语句慢

来自分类Dev

java.math.BigInteger,pow方法仅接受int