繁体   English   中英

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

[英]Is there an exponent operator in C#?

例如,是否存在运营商来处理这个问题?

float Result, Number1, Number2;

Number1 = 2;
Number2 = 2;

Result = Number1 (operator) Number2;

过去, ^运算符在其他语言中用作指数运算符,但在 C# 中它是按位运算符。

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

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

返回指定数字的指定幂。

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

float Result, Number1, Number2;

Number1 = 2;
Number2 = 2;

Result = Math.Pow(Number1, Number2);

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

4.95*Math.Pow(10,-10);

但后来我发现你可以做到

4.95E-10;

只是想我会为处于类似情况的任何人添加这个。

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

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


你问:

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

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

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

我很高兴我们使用了 C#,但是每当我编写包含指数的复杂方程时,它仍然让我烦恼。 Math.Pow()方法使方程很难阅读 IMO。

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

只要您将至少一个变量声明为DoubleX ,这DoubleX

DoubleX a = 2;
DoubleX b = 3;

Console.WriteLine($"a = {a}, b = {b}, a^b = {a ^ b}");

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

double c = 2;
double d = 3;

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

但是,这种方法的一个问题是,与其他运算符相比,指数的计算顺序是错误的。 这可以通过始终在操作周围添加一个额外的( )来避免,这再次使阅读等式变得有点困难:

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

我希望这对在代码中使用大量复杂方程的其他人有所帮助,也许有人甚至知道如何改进这种方法?!

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 --------------
    }
}

由于还没有人写过一个函数来用两个整数来做到这一点,这是一种方法:

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

或者在 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

我很惊讶没有人提到这一点,但是对于简单的(可能也是最常见的)平方的情况,你只需乘以它自己。

float someNumber;

float result = someNumber * someNumber;

值得一提的是,在提高 2 的幂来定义二进制常量时,我​​确实错过了 ^ 运算符。 不能在那里使用 Math.Pow(),但是将 1 的无符号整数按指数值向左移动是有效的。 当我需要定义一个 (2^24)-1 的常量时:

public static int Phase_count = 24;
public static uint PatternDecimal_Max = ((uint)1 << Phase_count) - 1;

记住类型必须是 (uint) << (int)。

它不是运算符,但您可以编写自己的扩展函数。

public static double Pow(this double value, double exponent)
{
    return Math.Pow(value, exponent);
}

这允许你写

a.Pow(b);

代替

Math.Pow(a, b);

我认为这使 a 和 ba 之间的关系更加清晰+您避免一遍又一遍地写“数学”。

一个好的幂函数是

public long Power(int number, int power) {
    if (number == 0) return 0;
    long t = number;
    int e = power;
    int result = 1;
    for(i=0; i<sizeof(int); i++) {
        if (e & 1 == 1) result *= t;
        e >>= 1;
        if (e==0) break;
        t = t * t;
    }
}

Math.Pow函数使用处理器功率函数,效率更高。

暂无
暂无

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

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