【问题标题】:How to do exponentiation in constant expression?如何在常量表达式中求幂?
【发布时间】:2017-10-31 23:36:19
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • C# 没有幂运算符。
  • @Tvde1 是的,我在问题中已经说过了。我在问是否有常量表达式的替代方法。
  • << 在有限的情况下有效,除了你运气不好
  • @harold 好主意,但仅适用于整数(不能对双精度数 AFAIK 进行按位运算)
  • readonly 是一个选项吗? public static readonly double MaxValue = MaxMantissa * Math.Pow(2.0, MaxExponent);

标签: c# math constants c#-6.0 exponent


【解决方案1】:

因为在您的特定情况下,您想将 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);

【讨论】:

    【解决方案2】:

    基本上你不能(除非,如前所述,2 的幂的平凡情况,可以通过移位运算符获得)。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-14
      • 2014-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多