C#中是否有指数运算符?

Cha*_*lie 184 c# operators exponent

例如,是否存在操作员来处理此问题?

float Result, Number1, Number2;

Number1 = 2;
Number2 = 2;

Result = Number1 (operator) Number2;
Run Code Online (Sandbox Code Playgroud)

在过去,^运算符已经成为其他语言的指数运算符,但在C#中它是一个逐位运算符.

我是否必须编写循环或包含另一个命名空间来处理指数操作?如果是这样,我如何使用非整数处理指数运算?

dtb*_*dtb 213

C#语言没有幂运算符.但是,.NET Framework提供了Math.Pow方法:

返回指定的数字,增加到指定的功率.

所以你的例子看起来像这样:

float Result, Number1, Number2;

Number1 = 2;
Number2 = 2;

Result = Math.Pow(Number1, Number2);
Run Code Online (Sandbox Code Playgroud)

  • 在尝试调试为什么我的计算不能与 ^ 一起工作时,通过硬方法了解到了这一点 (3认同)
  • 请记住使用 Math.Pow 进行平方时的性能损失:/sf/ask/65557901/#936909 (2认同)
  • @Justas我现在在.NET Core 2.1和Math.Pow上进行测试,现在比建议的替代实现更快。 (2认同)

Gen*_*rey 45

我偶然发现这篇文章在我的代码中使用科学记数法,我用过

4.95*Math.Pow(10,-10);
Run Code Online (Sandbox Code Playgroud)

但事后我发现你可以做到

4.95E-10;
Run Code Online (Sandbox Code Playgroud)

我想我会为处于类似情况的人添加这个.

  • 请记住,E 始终是以 10 为底的指数。我知道,如果我们仔细观察,我们就会理解这一点,但由于 OP 是关于一般指数的,我认为它值得强调。 (4认同)

Bri*_*ndy 32

MSDN上一篇关于为什么指数运算符不存在于C#团队的博客文章.

可以在语言中添加幂运算符,但在大多数程序中执行此操作是相当罕见的事情,并且在调用Math.Pow()很简单时添加运算符似乎不合理.


您询问:

我是否必须编写循环或包含另一个命名空间来处理指数操作?如果是这样,我如何使用非整数处理指数运算?

Math.Pow支持双参数,因此您无需编写自己的参数.

  • 我理解这个论点,但一个有效的理由是Math.Pow()不能用于设置const值,这使得exponents不能用于所有常量. (22认同)
  • 在用 C# 编写 Unity 游戏时,这是一件相当常见的事情,而当您想要的只是 2^X 或 X^2 或 X^3 等整数的整数幂时,花在双精度求幂上的时间就会被浪费。那。我一直需要它。 (2认同)
  • 当需要更长的时间时我并不介意,但是 Math.Pow 使用不精确的双精度数。对转换为双精度的整数值进行简单加法可以得到类似 n-1.99999999999742 的值,然后将其截断回整数并得到 n-1 而不是 n。 (2认同)

Pet*_*ter 6

在寻找一种新的语言将我们的计算软件转换为好的'vb6'时,缺乏指数C#操作符对我们来说是一个很大的烦恼.

我很高兴我们选择了C#,但每当我写一个包括指数的复杂方程时,它仍然会让我很烦.Math.Pow()方法使方程式很难读取IMO.

我们的解决方案是创建一个特殊的DoubleX类,我们覆盖^ -operator(见下文)

只要您将至少一个变量声明为DoubleX,这种方法就可以正常工作:

DoubleX a = 2;
DoubleX b = 3;

Console.WriteLine($"a = {a}, b = {b}, a^b = {a ^ b}");
Run Code Online (Sandbox Code Playgroud)

或在标准双打上使用显式转换器:

double c = 2;
double d = 3;

Console.WriteLine($"c = {c}, d = {d}, c^d = {c ^ (DoubleX)d}");     // Need explicit converter
Run Code Online (Sandbox Code Playgroud)

然而,该方法的一个问题是与其他运算符相比,指数的计算顺序错误.这可以通过在操作周围放置一个额外的()来避免再次使得读取方程更加困难:

DoubleX a = 2;
DoubleX b = 3;

Console.WriteLine($"a = {a}, b = {b}, 3+a^b = {3 + a ^ b}");        // Wrong result
Console.WriteLine($"a = {a}, b = {b}, 3+a^b = {3 + (a ^ b)}");      // Correct result
Run Code Online (Sandbox Code Playgroud)

我希望这可以帮助那些在代码中使用大量复杂方程的人,也许有人甚至知道如何改进这种方法?!:-)

DoubleX类:

using System;

namespace ExponentialOperator
{
    /// <summary>
    /// Double class that uses ^ as exponential operator
    /// </summary>
    public class DoubleX
    {
        #region ---------------- Fields ----------------

        private readonly double _value;

        #endregion ------------- Fields ----------------

        #region -------------- Properties --------------

        public double Value
        {
            get { return _value; }
        }

        #endregion ----------- Properties --------------

        #region ------------- Constructors -------------

        public DoubleX(double value)
        {
            _value = value;
        }

        public DoubleX(int value)
        {
            _value = Convert.ToDouble(value);
        }

        #endregion ---------- Constructors -------------

        #region --------------- Methods ----------------

        public override string ToString()
        {
            return _value.ToString();
        }

        #endregion ------------ Methods ----------------

        #region -------------- Operators ---------------

        // Change the ^ operator to be used for exponents.

        public static DoubleX operator ^(DoubleX value, DoubleX exponent)
        {
            return Math.Pow(value, exponent);
        }

        public static DoubleX operator ^(DoubleX value, double exponent)
        {
            return Math.Pow(value, exponent);
        }

        public static DoubleX operator ^(double value, DoubleX exponent)
        {
            return Math.Pow(value, exponent);
        }

        public static DoubleX operator ^(DoubleX value, int exponent)
        {
            return Math.Pow(value, exponent);
        }

        #endregion ----------- Operators ---------------

        #region -------------- Converters --------------

        // Allow implicit convertion

        public static implicit operator DoubleX(double value)
        {
            return new DoubleX(value);
        }

        public static implicit operator DoubleX(int value)
        {
            return new DoubleX(value);
        }

        public static implicit operator Double(DoubleX value)
        {
            return value._value;
        }

        #endregion ----------- Converters --------------
    }
}
Run Code Online (Sandbox Code Playgroud)


Nat*_*rad 5

由于还没有人编写一个函数来使用两个整数执行此操作,因此有一种方法:

private static long CalculatePower(int number, int powerOf)
{
    long result = number;
    for (int i = 2; i <= powerOf; i++)
        result *= number;
    return result;
}
Run Code Online (Sandbox Code Playgroud)

或者在 VB.NET 中:

Private Function CalculatePower(ByVal number As Integer, ByVal powerOf As Integer) As Long
    Dim result As Long = number
    For i As Integer = 2 To powerOf
        result = result * number
    Next
    Return result
End Function
CalculatePower(5, 3) ' 125
CalculatePower(8, 4) ' 4096
CalculatePower(6, 2) ' 36
Run Code Online (Sandbox Code Playgroud)

  • 因为有 Math.Pow 所以你的代码是无关紧要的 (16认同)
  • @Nathangrad 重新发明(方形)轮在很大程度上被认为是一种反模式。仅供参考:https://exceptionnotfound.net/reinventing-the-square-wheel-the-daily-software-anti-pattern/ (6认同)
  • 真的需要 VB .NET 版本吗?因为 VB .NET 已经有了指数运算符... (4认同)