C #에 지수 연산자가 있습니까?


194

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

float Result, Number1, Number2;

Number1 = 2;
Number2 = 2;

Result = Number1 (operator) Number2;

과거에 ^연산자는 다른 언어에서는 지수 연산자로 사용되었지만 C #에서는 비트 연산자입니다.

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


7
C #에는 없지만 많은 언어 **가 삽입 지수 연산자 로 사용 됩니다.
Mark Rushakoff

내가 long / Int64에 저장된 10 ^ 7이 나에게 "13"을주고 있다는 것에 화가 났기 때문에 여기에왔다. 1E7도 시도했지만 유형 오류가 발생했습니다. 형식 오류 / 불법 연산자 구문 오류가 표시되지 않았으므로 10 ^ 7이 작동한다고 가정했습니다.
mpag

1
@mpag ^는 배타적이거나 연산자이므로 10 ^ 7 = 1010b XOR 0111b = 1101b = 13입니다.
Ian Brockbank

답변:


228

C # 언어 에는 전력 연산자가 없습니다 . 그러나 .NET Framework는 Math.Pow 메서드를 제공합니다 .

지정된 거듭 제곱으로 지정된 숫자를 반환합니다.

따라서 귀하의 예는 다음과 같습니다.

float Result, Number1, Number2;

Number1 = 2;
Number2 = 2;

Result = Math.Pow(Number1, Number2);

1
스 쿼링을 위해 Math.Pow를 사용하는 경우 성능 저하를 염두에 두십시오. stackoverflow.com/questions/936541/…
Justas

4
@Justas 방금 .NET Core 2.1에서 테스트했으며 Math.Pow가 제안 된 대체 구현보다 빠릅니다.
bytedev

50

내 코드에서 과학적 표기법을 사용하려고하는이 게시물을 우연히 발견했습니다.

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

그러나 나중에 나는 당신이 할 수있는 것을 발견

4.95E-10;

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


34

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

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


당신은 물었다 :

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

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


24
나는 인수를 이해하지만 유효한 이유는 Math.Pow ()를 사용하여 const 값을 설정할 수 없기 때문에 모든 상수에 지수를 사용할 수 없다는 것입니다.
jsmars

1
Power 연산자는 연산자 오버로드에 편리합니다. Math.Pow ()는 Math.Pow ()가 연산자가 아니기 때문에 지수 연산자를 만들지 않는다는 사실을 정당화하지 않습니다. 따라서 연산자와 사용법이 다릅니다. .
Alexandre Daubricourt

8

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

2

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

float Result, Number1;

Result = Number1 * Number1;

4
곱셈이 아니라 그 힘.
Henry

예 @Henry 및 다른 사람들이 언급했듯이 연산자는 존재하지 않습니다. 그냥 Math.Pow. 나는 가장 일반적인 경우에 대한 명확한 해결책을 제시하고있었습니다.
RubberDuck

4
Math.Pow(Number1, 2)
lamont

2

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

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

누군가 공감대를 설명해 주시겠습니까? 이 코드를 테스트했으며 ideone.com/o9mmAo(C# ) 및 ideone.com/vnaczj(VB.NET )에서도 완벽하게 작동합니다.
Nathangrad

8
Math.Pow가 있으므로 코드와 관련이 없습니다.
Thaina

1
Math.Pow ()는 느리지 만 PowerOf가 합리적으로 작은 한 상당히 빠릅니다.
lamont

3
@Nathangrad (사각형) 바퀴를 재창조하는 것은 크게 반 패턴으로 간주됩니다. 참고 : exceptionnotfound.net/…
bytedev

또한 자체 전원 방법을 구현하는 더 빠른 방법이 있습니다. 참조 : en.wikipedia.org/wiki/Exponentiation_by_squaring
Jesse Chisholm

0

좋은 힘 기능은

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


0

이진 상수를 정의하기 위해 2의 거듭 제곱을 올릴 때 ^ 연산자를 그리워합니다. 거기에서 Math.Pow ()를 사용할 수는 없지만 지수 값으로 부호없는 int를 1로 왼쪽으로 이동하십시오. 상수 (2 ^ 24) -1을 정의해야 할 때 :

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

유형은 (uint) << (int) 여야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.