繁体   English   中英

如何在常量表达式中求幂?

[英]How to do exponentiation in constant expression?

此问题之后在 VB 类的公共常量的初始化中使用了指数运算符^

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

我正在将类转换为 C#。 但是我发现 C# 没有相同的运算符( ^仍然是一个运算符,但仅作为按位异或)。

Math.Pow() 作为运算符的替代方案给出,但不能用于常量表达式。 那么如何在 C# 中用指数表达式初始化一个常量呢?

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

因为在您的特定情况下,您希望将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 MaxExponent值时),您可以尝试将const更改为readonly

public static readonly double MaxValue = MaxMantissa * Math.Pow(2.0, MaxExponent);

基本上你不能(除非,如上所述,对于 2 的幂的微不足道的情况,可以通过移位运算符获得)。

您可以对值进行硬编码并添加注释,或者您可以使用static readonly ,但请注意static readonly没有相同的“烘焙到调用站点”语义。 大多数情况下,这不会出现问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM