La falta de un operador exponencial para C# fue una gran molestia para nosotros en la búsqueda de un nuevo lenguaje para convertir nuestro software de cálculo a partir de los viejos VB6'.
Estoy contento de haber ido con C#, pero aún me molesta cada vez que estoy escribiendo una ecuación compleja que incluye exponentes. El método Math.Pow() hace que las ecuaciones sean bastante difíciles de leer como IMO.
Nuestra solución fue crear una clase especial donde DoubleX sobreescribimos el^-operator (ver más abajo)
Esto funciona bastante bien, siempre y cuando se declara al menos una de las variables como DoubleX:
DoubleX a = 2;
DoubleX b = 3;
Console.WriteLine($"a = {a}, b = {b}, a^b = {a^b}");
o utilizar un convertidor explícita en dobles estándar:
double c = 2;
double d = 3;
Console.WriteLine($"c = {c}, d = {d}, c^d = {c^(DoubleX)d}"); // Need explicit converter
un problema con este método es sin embargo que el exponente se calcula en el orden equivocado compa rojo a otros operadores. Esto se puede evitar poniendo siempre un extra() en torno a la operación que a su vez hace que sea un poco más difícil de leer las ecuaciones:
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
espero que esto puede ser de ayuda para otras personas que utiliza una gran cantidad de ecuaciones complejas en su código, y tal vez alguien incluso tenga una idea de cómo mejorar este método ?! :-)
clase 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 --------------
}
}
No es en C#, pero el uso de muchos idiomas '' ** como el operador infijo exponenciación. –
llegó aquí porque me molestaba que 10^7 almacenado en un int64 largo me estaba dando "13". También probé 1E7, pero eso me dio un error de tipo. Como no estaba viendo un error de tipo/error de sintaxis del operador ilegal, asumí que mi 10^7 estaba funcionando ... – mpag