Das Fehlen eines exponentiellen Operator für C# war ein großes Ärgernis für uns, wenn für eine neue Sprache sucht unsere Berechnungssoftware aus dem guten alten VB6 zu konvertieren.
Ich bin froh, dass wir mit C# gegangen sind, aber es ärgert mich immer, wenn ich eine komplexe Gleichung einschließlich Exponenten schreibe. Die Math.Pow() - Methode macht Gleichungen sehr schwer zu lesen IMO.
war unsere Lösung eine spezielle DoubleX Klasse zu schaffen, in dem wir die^-Operator (siehe unten) außer Kraft setzen
Diese ziemlich gut, so lange funktioniert, wie Sie mindestens eine der Variablen als DoubleX erklären:
DoubleX a = 2;
DoubleX b = 3;
Console.WriteLine($"a = {a}, b = {b}, a^b = {a^b}");
oder einen expliziten Konverter auf Standard-Doppelzimmer verwenden:
double c = 2;
double d = 3;
Console.WriteLine($"c = {c}, d = {d}, c^d = {c^(DoubleX)d}"); // Need explicit converter
ein Problem bei dieser Methode ist jedoch, dass der Exponent in der falschen Reihenfolge compa berechnet rot zu anderen Betreibern. Dies kann durch immer setzen eine zusätzliche() um den Betrieb vermieden werden, was wiederum macht es etwas schwieriger, die Gleichungen zu lesen:
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
Ich hoffe, dass diese Hilfe für andere sein können, die viel komplexer Gleichungen verwendet in ihr Code, und vielleicht hat jemand sogar eine Idee, wie man diese Methode verbessern kann ?! :-)
DoubleX Klasse:
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 --------------
}
}
Es ist nicht in C#, aber viele Sprachen verwenden '' ** als Infix Potenzierungsoperator. –
kam hierher, weil ich verärgert war, dass 10^7 in einem langen gespeichert/Int64 gab mir "13." Ich hatte auch 1E7 versucht, aber das gab mir einen Typfehler. Da ich keinen Typfehler/unzulässigen Operator-Syntaxfehler sah, hatte ich angenommen, dass meine 10^7 funktionierte ... – mpag