Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用Math.Pow(10,n)可以吗?_C#_.net_Math - Fatal编程技术网

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

C# 使用Math.Pow(10,n)可以吗?,c#,.net,math,C#,.net,Math,我需要计算功率(10,n) 可以使用Math.Pow(10,n) 还是应该使用循环 for (int i = 0; i < n; i++){ x*=10; } for(int i=0;i如果基数和指数都是整数,你可能会考虑不使用POW。但即使在这种情况下,Pow通常也更好,因为它更具可读性。如果至少有一个是浮点值,请使用Pow 如果指数为0.5,则应使用Sqrt,如果指数为小整数(2,3,4),则用乘法表示公式的速度更快,但可读性较差 如果您想用整数指数实现快速求幂,您可能需要的是平

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

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

还是应该使用循环

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

哪一个更好?为什么呢?

Math.Pow是为您提供的,并且有很好的文档记录

任何问题都在文档中


为什么您不想使用提供的函数?

取决于哪个函数更清楚地传达“10到n的幂”

在我的例子中,
Math.Pow(10,n)
(虽然这可能意味着数学,但我不知道,他们脸上的10和n也可能是数学)


这类似于我宁愿用代数的方式将“10的n次幂”表示为
10^n
(或
10n
),而不是
10*10*10*。*10 n次
,特别是考虑到n是可变的。

是的,可以对整数使用
Math.Pow()
,可能For循环比
Math.Pow
更快,后者可能处理浮点数。但我严重怀疑这种差异在你的情况下是否有重大意义(尽管我不知道)


但如果使用32位有符号整数,则只能存储n
Math的10^n值。Pow
更好。
这里有一条经验法则——在99%的场景中,内置函数优于自定义实现。这使您的代码更清晰,节省了大量工作,并减少了出错的机会


只有当你认为使用内置函数时,它们并不意味着要使用,或者当它们有严重的延迟问题时(从来没有遇到过这些情况,老实说),你是否应该考虑建立自己的实现。

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

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


如果您想用整数指数实现快速求幂,您可能需要的是平方乘算法而不是简单的循环。但是在大多数情况下,Pow速度更快。

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

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


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

整数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;
}
private static readonly Int64[]PowBase10Cache={
1.
10,
100,
1000,
10000,
100000,
1000000,
10000000,
100000000,
1000000000,
10000000000,
100000000000,
1000000000000,
10000000000000,
100000000000000,
1000000000000000,
10000000000000000,
100000000000000000,
1000000000000000000,
};
公共静态Int64 IPowBase10(int exp)
{
返回exp0)
{
如果((exp&1)!=0)
{
结果*=基准值;
}
exp>>=1;
baseVal*=baseVal;
}
返回结果;
}

为什么你会认为
Math.Pow
不好?我不知道.NET,但OP可能关心的是,Pow接受一个浮点并返回一个浮点,而他只能处理整数(如果n不是太大)。没错,我关心的是浮点。@Andreas,但浮点数学并不慢。而带有整数的浮点数学不会失去精度。@KirkWoll
float
带有整数的数学一旦涉及的整数大于2^24就会失去精度,因为一个
float
只有24位尾数。无论如何,现代计算机每秒可以进行(数千万)个浮点求幂运算,因此,除非你在高级3D游戏中做一些非常紧密的循环,否则性能不会是问题…+1用于查找-如果
n因为四舍五入错误,肯定是最快的。想试试
10^4.999999997