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 --------------
}
}
**
가 삽입 지수 연산자 로 사용 됩니다.