可以使用Math.Pow(10,n)吗?

时间:2010-10-23 16:41:14

标签: c# .net math

我需要计算功率(10,n)

使用Math.Pow (10, n)可以吗?

或者我应该使用循环?

for (int i = 0; i < n; i++){
  x*=10;
}

哪一个更好?为什么?

8 个答案:

答案 0 :(得分:9)

Math.Pow更好。
这是经验法则 - 在99%的场景中,支持内置函数而不是自定义实现。这使您的代码更加清晰,节省了大量工作,并减少了出错的机会。

只有当您考虑使用内置函数时才会使用它们,或者当它们遇到严重的延迟问题时(从未遇到过这些情况,说实话),您是否应该考虑构建一个实现

答案 1 :(得分:9)

如果base和exponent都是整数,你可能会考虑不使用Pow。但即使在那种情况下,Pow通常更好,因为它更具可读性。如果至少有一个是浮点值,请使用Pow。

如果指数为0.5,则应使用Sqrt,如果指数是一个小整数(2,3,4),则表示具有乘法的公式更快,但可读性更低。

如果要使用整数指数实现快速求幂,则可以使用Square-and-Multiply算法而不是简单的循环。但在大多数情况下,Pow仍然更快。

答案 2 :(得分:8)

对于整数,也许for循环比Math.Pow更快,它可能处理浮点数。但我非常怀疑你的情况有多大差异(即使我不知道)。

但是如果你使用32位有符号整数,那么你只能存储10 ^ n的值为n&lt; = 9.但是你可以通过存储这九个(十个)来获得速度(也许是可读性)数组中的十个幂。这并不难:它们是(1),10,100,1000,......

如果需要为较大的n计算10 ^ n,则需要使用浮点数。然后没有任何理由不使用Math.Pow。这是最快的,并且易于阅读。

答案 3 :(得分:4)

取决于哪一个更清楚地传达“10与n的力量”。

在我的情况下,Math.Pow(10, n)(尽管它可能意味着数学,也可能是punching 10和n在他们的脸上,我不知道。)

与我10^n(或10n)代替10 * 10 * 10 * ... * 10 n times而非{{1}}相比,我更倾向于代数表达“10的幂来”,特别是考虑到n是可变的。 / p>

答案 4 :(得分:3)

答案通常是肯定的,使用Math.Pow()。

但是:如果这段代码真的是时间关键的,并且你知道你正在处理小功率1-9,那么结果可以在Int32中表示,那么值得优化。我刚刚制作了一个快速的测试应用程序,并对这两个版本进行了分析(确保编译器没有优化任何代码),并且我的笔记本电脑上最坏情况下10 ^ 9的结果是循环 20比Math.Pow(10,9)更快

但请记住,也许这个计算毕竟不是瓶颈。如果您知道某事实,例如,如果您已经分析了应用程序并发现它是一个真正的问题,那么继续使用基于循环的方法替换它(或者更好的是,数组查找)。如果你只是猜测它可能有问题,那么我建议你坚持使用Math.Pow。通常:只优化您知道的代码是性能瓶颈。

答案 5 :(得分:1)

Math.Pow是为您提供的,并且有详细记录。

任何陷阱都在文档中。

为什么想要使用提供的功能?

答案 6 :(得分:0)

整数Pow的实现方式要比循环中乘以10多得多。

例如,参见this answer,它也适用于其他基本值,而不仅仅是10。

还要考虑将结果缓存到一个数组中,直到合理数量。

这是我最近的代码,供参考:

private static readonly Int64[] PowBase10Cache = {
    1,
    10,
    100,
    1000,
    10000,
    100000,
    1000000,
    10000000,
    100000000,
    1000000000,
    10000000000,
    100000000000,
    1000000000000,
    10000000000000,
    100000000000000,
    1000000000000000,
    10000000000000000,
    100000000000000000,
    1000000000000000000,
    };

public static Int64 IPowBase10(int exp)
{
    return exp < PowBase10Cache.Length ? PowBase10Cache[exp] : IPow(10L, exp);
}

public static Int64 IPow(Int64 baseVal, int exp)
{
    Int64 result = 1;
    while (exp > 0)
    {
        if ((exp & 1) != 0)
        {
            result *= baseVal;
        }
        exp >>= 1;
        baseVal *= baseVal;
    }
    return result;
}

答案 7 :(得分:-1)

是的,可以使用Math.Pow()