如何在常量表达式中求幂?
How to do exponentiation in constant expression?
在 VB class 的 public 常量 .
的初始化中使用了指数运算符 ^
Public Const MaxValue As Double = MaxMantissa * (2 ^ MaxExponent)
我正在将 class 转换为 C#。但是我发现 C# 没有相同的运算符(^
仍然是一个运算符,但只是按位异或)。
Math.Pow()
对运算符来说是 given as an alternative,但不能用在常量表达式中。那么如何在 C# 中使用指数表达式初始化常量?
(我不使用值代替表达式,因为表达式中的值也是常量,来自不同的地方。MaxExponent
来自基数 class,MaxMantissa
在每个派生class中都是不同的。此外,在每个派生class中有多个这样的常量,例如MaxPositiveValue
、MinPositiveValue
、MinNegativeValue
、[=19] =], 等等)
因为在你的特定情况下你想将 2 提高到 MaxExponent
power
2 ** MaxExponent
你可以把它写成左移,但是当且仅当MaxExponent
是一个小的正整数值:
1 << MaxExponent
像这样
// double: see comments below `1L` stands for `long` and so MaxExponent = [0..63]
public const double MaxValue = MaxMantissa * (1L << MaxExponent);
在一般情况下(当MaxExponent
是任意double
值时),您可以尝试将const
更改为readonly
public static readonly double MaxValue = MaxMantissa * Math.Pow(2.0, MaxExponent);
基本上你不能(除了,如前所述,对于 2 的幂的简单情况,它可以通过移位运算符获得)。
您可以对值进行硬编码并添加注释,或者您可以使用 static readonly
,但请注意 static readonly
没有相同的 "bake into the call-site" 语义。 大多数 情况下没有问题。
在 VB class 的 public 常量
^
Public Const MaxValue As Double = MaxMantissa * (2 ^ MaxExponent)
我正在将 class 转换为 C#。但是我发现 C# 没有相同的运算符(^
仍然是一个运算符,但只是按位异或)。
Math.Pow()
对运算符来说是 given as an alternative,但不能用在常量表达式中。那么如何在 C# 中使用指数表达式初始化常量?
(我不使用值代替表达式,因为表达式中的值也是常量,来自不同的地方。MaxExponent
来自基数 class,MaxMantissa
在每个派生class中都是不同的。此外,在每个派生class中有多个这样的常量,例如MaxPositiveValue
、MinPositiveValue
、MinNegativeValue
、[=19] =], 等等)
因为在你的特定情况下你想将 2 提高到 MaxExponent
power
2 ** MaxExponent
你可以把它写成左移,但是当且仅当MaxExponent
是一个小的正整数值:
1 << MaxExponent
像这样
// double: see comments below `1L` stands for `long` and so MaxExponent = [0..63]
public const double MaxValue = MaxMantissa * (1L << MaxExponent);
在一般情况下(当MaxExponent
是任意double
值时),您可以尝试将const
更改为readonly
public static readonly double MaxValue = MaxMantissa * Math.Pow(2.0, MaxExponent);
基本上你不能(除了,如前所述,对于 2 的幂的简单情况,它可以通过移位运算符获得)。
您可以对值进行硬编码并添加注释,或者您可以使用 static readonly
,但请注意 static readonly
没有相同的 "bake into the call-site" 语义。 大多数 情况下没有问题。