Kurangnya operator eksponensial untuk C # adalah gangguan besar bagi kami ketika mencari bahasa baru untuk mengkonversi perangkat lunak perhitungan kami ke dari vb6 ol yang baik.
Saya senang kami pergi dengan C # tetapi masih mengganggu saya setiap kali saya menulis persamaan kompleks termasuk eksponen. Metode Math.Pow () membuat persamaan cukup sulit untuk membaca IMO.
Solusi kami adalah membuat kelas DoubleX khusus tempat kami menimpa ^ -operator (lihat di bawah)
Ini berfungsi cukup baik selama Anda mendeklarasikan setidaknya satu variabel sebagai DoubleX:
DoubleX a = 2;
DoubleX b = 3;
Console.WriteLine($"a = {a}, b = {b}, a^b = {a ^ b}");
atau gunakan konverter eksplisit pada standar ganda:
double c = 2;
double d = 3;
Console.WriteLine($"c = {c}, d = {d}, c^d = {c ^ (DoubleX)d}"); // Need explicit converter
Satu masalah dengan metode ini adalah eksponen dihitung dalam urutan yang salah dibandingkan dengan operator lain. Ini dapat dihindari dengan selalu meletakkan ekstra () di sekitar operasi yang lagi-lagi membuatnya agak sulit untuk membaca persamaan:
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
Saya harap ini dapat membantu orang lain yang menggunakan banyak persamaan kompleks dalam kode mereka, dan mungkin seseorang bahkan memiliki ide tentang bagaimana meningkatkan metode ini ?! :-)
Kelas 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 --------------
}
}
**
sebagai operator eksponensial infix.