C #에 지수 연산자가 있습니까? 2; Result =

예를 들어, 이것을 처리하기 위해 연산자가 있습니까?

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;

내가 비슷한 상황에있는 사람에게 이것을 추가 할 것이라고 생각했습니다.


답변

지수 연산자가 C # 팀 에없는 이유에 대한 MSDN블로그 게시물이 MSDN에 있습니다 .

언어에 전력 연산자를 추가하는 것이 가능하지만이 작업을 수행하는 것은 대부분의 프로그램에서 수행하기 매우 드문 일이며 Math.Pow ()를 호출 할 때 연산자를 추가하는 것이 타당하지 않은 것 같습니다 .


당신은 물었다 :

지수 연산을 처리하기 위해 루프를 작성하거나 다른 네임 스페이스를 포함시켜야합니까? 그렇다면 비 정수를 사용하여 지수 연산을 어떻게 처리합니까?

Math.Pow는 이중 매개 변수를 지원하므로 직접 작성할 필요가 없습니다.


답변

C #에 대한 지수 연산자가 없다는 것은 계산 소프트웨어를 좋은 vb6에서 변환 할 새로운 언어를 찾을 때 큰 성가심이었습니다.

C #을 사용하게되어 기쁘지만 지수를 포함하여 복잡한 방정식을 작성할 때마다 여전히 짜증납니다. Math.Pow () 메서드는 방정식을 읽기 어려운 IMO로 만듭니다.

우리의 해결책은 ^ 연산자를 재정의하는 특별한 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 --------------
    }
}

답변

나는 아무도 이것을 언급하지 않은 것에 놀랐지 만, 간단하고 (아마도 가장 많이 만난) 제곱의 경우에는 그 자체가 곱해집니다.

float Result, Number1;

Result = Number1 * Number1;

답변

아무도 아직 두 개의 정수 로이 작업을 수행하는 함수를 작성하지 않았으므로 한 가지 방법이 있습니다.

private long CalculatePower(int number, int powerOf)
{
    for (int i = powerOf; i > 1; i--)
        number *= number;
    return number;
}
CalculatePower(5, 3); // 125
CalculatePower(8, 4); // 4096
CalculatePower(6, 2); // 36

또는 VB.NET에서 :

Private Function CalculatePower(number As Integer, powerOf As Integer) As Long
    For i As Integer = powerOf To 2 Step -1
        number *= number
    Next
    Return number
End Function
CalculatePower(5, 3) ' 125
CalculatePower(8, 4) ' 4096
CalculatePower(6, 2) ' 36

답변

좋은 힘 기능은

    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` 기능은 프로세서 전원 기능을 사용하며보다 효율적입니다.