Cha*_*lie 184 c# operators exponent
例如,是否存在操作员来处理此问题?
float Result, Number1, Number2;
Number1 = 2;
Number2 = 2;
Result = Number1 (operator) Number2;
Run Code Online (Sandbox Code Playgroud)
在过去,^
运算符已经成为其他语言的指数运算符,但在C#中它是一个逐位运算符.
我是否必须编写循环或包含另一个命名空间来处理指数操作?如果是这样,我如何使用非整数处理指数运算?
dtb*_*dtb 213
C#语言没有幂运算符.但是,.NET Framework提供了Math.Pow方法:
返回指定的数字,增加到指定的功率.
所以你的例子看起来像这样:
float Result, Number1, Number2;
Number1 = 2;
Number2 = 2;
Result = Math.Pow(Number1, Number2);
Run Code Online (Sandbox Code Playgroud)
Gen*_*rey 45
我偶然发现这篇文章在我的代码中使用科学记数法,我用过
4.95*Math.Pow(10,-10);
Run Code Online (Sandbox Code Playgroud)
但事后我发现你可以做到
4.95E-10;
Run Code Online (Sandbox Code Playgroud)
我想我会为处于类似情况的人添加这个.
Bri*_*ndy 32
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}");
Run Code Online (Sandbox Code Playgroud)
或在标准双打上使用显式转换器:
double c = 2;
double d = 3;
Console.WriteLine($"c = {c}, d = {d}, c^d = {c ^ (DoubleX)d}"); // Need explicit converter
Run Code Online (Sandbox Code Playgroud)
然而,该方法的一个问题是与其他运算符相比,指数的计算顺序错误.这可以通过在操作周围放置一个额外的()来避免再次使得读取方程更加困难:
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
Run Code Online (Sandbox Code Playgroud)
我希望这可以帮助那些在代码中使用大量复杂方程的人,也许有人甚至知道如何改进这种方法?!:-)
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 --------------
}
}
Run Code Online (Sandbox Code Playgroud)
由于还没有人编写一个函数来使用两个整数执行此操作,因此有一种方法:
private static long CalculatePower(int number, int powerOf)
{
long result = number;
for (int i = 2; i <= powerOf; i++)
result *= number;
return result;
}
Run Code Online (Sandbox Code Playgroud)
或者在 VB.NET 中:
Private Function CalculatePower(ByVal number As Integer, ByVal powerOf As Integer) As Long
Dim result As Long = number
For i As Integer = 2 To powerOf
result = result * number
Next
Return result
End Function
CalculatePower(5, 3) ' 125
CalculatePower(8, 4) ' 4096
CalculatePower(6, 2) ' 36
Run Code Online (Sandbox Code Playgroud)