繁体   English   中英

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

[英]Is it OK to use Math.Pow (10, n)?

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

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

或者我应该使用循环?

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

哪一个更好? 为什么?

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

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

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

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

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

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

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

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

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

在我的例子中, Math.Pow(10, n) (尽管它可能意味着数学,也可以在他们的脸上冲击 10和n,我不知道)。

它类似于我更代数地将“10的幂与n”表示为10^n (或10 n )而不是10 * 10 * 10 * ... * 10 n times ,特别是考虑到n是可变的。

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

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

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

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

任何陷阱是文档。

为什么你希望使用所提供的功能?

有更多高性能Pow的实现方式,而不是在循环中乘以10。

例如,请参阅此答案 ,它也适用于其他基本值,而不仅仅是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;
}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM