如何在C#中计算幂?

67

我不太擅长数学,而且C#似乎没有提供幂函数,所以我想知道是否有人知道如何运行像这样的计算:

var dimensions = ((100*100) / (100.00^3.00));

1
那么 var dimensions = 1.0f/100? :) - CompuChip
9个回答

98

请参考Math.Pow文档。该函数接受一个值并将其提高到指定的幂:

Math.Pow(100.00, 3.00); // 100.00 ^ 3.00

谢谢,这是最终计算结果: 变量dimensions = (100*100)/(Math.Pow(100.00, 3.00)); - davethecoder

15

11
我回答这个问题是因为我找不到任何关于为什么 ^ 不能用于幂运算的答案。在 C# 中,^ 运算符 是一个 异或 运算符,简写为 XOR。对于 A ^ B真值表 显示,只有当输入不同时才会输出 true。
输入A 输入B 输出
0 0 0
0 1 1
1 0 1
1 1 0

这意味着100 ^ 3在底层执行以下计算:

decimal   binary
    100 = 0110 0100 
      3 = 0000 0011
    ---   --------- ^
    103 = 0110 0111

当然,使用 Math.Pow(100, 3) 并不等同于一百万的结果。您可以使用该方法或其他现有答案之一。


你也可以将代码简化为以下形式,这样做得到的结果是相同的,因为 C# 尊重运算优先级
double dimensions = 100 * 100 / Math.Pow(100, 3); // == 0.01

6
你想要的函数是 System.Math 中的 Math.Pow

5

请勿使用Math.Pow

当我使用时

for (int i = 0; i < 10e7; i++)
{
    var x3 = x * x * x;
    var y3 = y * y * y;
}

只需要230毫秒,而下面的则需要惊人的7050毫秒:

for (int i = 0; i < 10e7; i++)
{
    var x3 = Math.Pow(x, 3);
    var y3 = Math.Pow(x, 3);
}

好的,我们都预计Math.Pow会慢一些。但不至于这么慢。为什么?现在让我们做作业并检查编译器生成的代码(JIT后的cs和汇编),你可能会感到惊讶。试试看... - Adriano Repetti
我本来想修改这个 https://github.com/THEjoezack/ColorMine/tree/master/ColorMine/ColorSpaces,因为其中有一个`x*x*x`的地方,本以为可以用`x^3`替换,但结果不行,于是我尝试使用了`Math.Pow`。在math.cs的参考源代码中,我找到了这个函数: public static extern double Pow(double x, double y); 所以我无法查看源代码,我错在哪里了? - Christopher Aicher
我应该在那里找到什么? - Christopher Aicher
4
你的版本更快,因为它只使用整数,那么例如对于 x^x ,你会怎么做? - zedling
1
@zedling 你确定那是原因吗?我刚试了一下,其中x是一个有很多小数位的双精度浮点数,结果却是一样的!(231毫秒 vs 4870毫秒):https://dotnetfiddle.net/jgNDfm - Ben
不是的,经过一些搜索,我找到了这个:https://dev59.com/-nNA5IYBdhLWcg3wgeAd#936548 - zedling

3
以下是计算正负小数幂值的RaiseToPower代码。
public decimal Power(decimal number, decimal raiseToPower)
        {
            decimal result = 0;
            if (raiseToPower < 0)
            {
                raiseToPower *= -1;
                result = 1 / number;
                for (int i = 1; i < raiseToPower; i++)
                {
                    result /= number;
                }
            }
            else
            {
                result = number;
                for (int i = 0; i <= raiseToPower; i++)
                {
                    result *= number;
                }
            }
            return result;
        }

3

对于2的幂次方:

var twoToThePowerOf = 1 << yourExponent;
// eg: 1 << 12 == 4096

1

Math.Pow() 返回 double,因此最好这样写:

double d = Math.Pow(100.00, 3.00);

0
static void Main(string[] args)
        {
            int i = 2;
            int n = -2;
            decimal y = 1;
            if (n > 0)
            {
                for (int x = 1; x <= n; x++)
                    y *= i;               
            }
            if (n < 0)
            {
                for (int x = -1; x >= n; x--)
                    y /= i;
            }
            Console.WriteLine(y);
        }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接