如何在常量表达式中取幂运算?

时间:2017-05-31 08:56:19

标签: c# const c#-6.0 exponent

this question之后初始化VB类的公共常量时使用了指数运算符^

Public Const MaxValue As Double = MaxMantissa * (2 ^ MaxExponent)

我正在将类转换为C#。但是我发现C#没有相同的运算符(^仍然是运算符,但只是按位xor)。

Math.Pow()对运算符是given as an alternative,但不能用于常量表达式。那么如何用C#中的指数表达式初始化常量?

(我不使用值而不是表达式,因为表达式中的值也是常量,来自不同的地方。MaxExponent来自基类,MaxMantissa在每个派生中都不同此外,在每个派生类中都有多个这样的常量,例如MaxPositiveValueMinPositiveValueMinNegativeValueMaxNegativeValue等。)

2 个答案:

答案 0 :(得分:6)

因为在您的特定情况下,您希望将 2 提升为MaxExponent权力

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);

答案 1 :(得分:2)

你基本上不能(除非另有说明,因为2的权力的微不足道的情况可以通过移位算子获得)。

您可以对值进行硬编码并添加注释,也可以使用static readonly,但请注意static readonly没有相同的“烘焙到调用网站”语义。在大多数案例中没有出现问题。