例如,是否存在操作员来处理此问题?
float Result, Number1, Number2;
Number1 = 2;
Number2 = 2;
Result = Number1 (operator) Number2;
过去,该^
运算符曾用其他语言作为指数运算符,但在C#中是按位运算符。
我是否必须编写一个循环或包含另一个名称空间来处理指数运算?如果是这样,我该如何使用非整数处理指数运算?
例如,是否存在操作员来处理此问题?
float Result, Number1, Number2;
Number1 = 2;
Number2 = 2;
Result = Number1 (operator) Number2;
过去,该^
运算符曾用其他语言作为指数运算符,但在C#中是按位运算符。
我是否必须编写一个循环或包含另一个名称空间来处理指数运算?如果是这样,我该如何使用非整数处理指数运算?
Answers:
C#语言没有幂运算符。但是,.NET Framework提供了Math.Pow方法:
返回提高到指定幂的指定数字。
因此,您的示例如下所示:
float Result, Number1, Number2;
Number1 = 2;
Number2 = 2;
Result = Math.Pow(Number1, Number2);
MSDN上有一篇博客文章,介绍为什么 C#团队不存在指数运算符。
可以在语言中添加一个幂运算符,但是执行此操作在大多数程序中很少见,并且在调用Math.Pow()时添加一个运算符似乎不合理。
你问:
我是否必须编写一个循环或包含另一个名称空间来处理指数运算?如果是这样,我该如何使用非整数处理指数运算?
Math.Pow支持双参数,因此您无需编写自己的参数。
在寻找一种将计算软件转换为良好的vb6语言的新语言时,C#缺少指数运算符对我们来说是一个很大的烦恼。
我很高兴我们选择了C#,但是每当我编写包含指数的复杂方程式时,它仍然使我感到烦恼。Math.Pow()方法使方程式很难阅读IMO。
我们的解决方案是创建一个特殊的DoubleX类,在其中重写^ -operator(请参见下文)
只要您将至少一个变量声明为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 --------------
}
}
令我惊讶的是,没有人提到这一点,但是对于平方(可能是最常遇到的)这种简单的情况,您只需要自己相乘即可。
float Result, Number1;
Result = Number1 * Number1;
Math.Pow
。我只是为最常见的情况提供了一个显而易见的解决方案。
Math.Pow(Number1, 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
**
用作中缀指数运算符。