C# 使用Math.Pow(10,n)可以吗?
我需要计算功率(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),则用乘法表示公式的速度更快,但可读性较差 如果您想用整数指数实现快速求幂,您可能需要的是平
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,但浮点数学并不慢。而带有整数的浮点数学不会失去精度。@KirkWollfloat
带有整数的数学一旦涉及的整数大于2^24就会失去精度,因为一个float
只有24位尾数。无论如何,现代计算机每秒可以进行(数千万)个浮点求幂运算,因此,除非你在高级3D游戏中做一些非常紧密的循环,否则性能不会是问题…+1用于查找-如果n因为四舍五入错误,肯定是最快的。想试试10^4.999999997
?