如何声明任意位模式的浮点型Go常量?

时间:2017-06-13 14:44:55

标签: go floating-point bit-manipulation constants

在Go中我可以声明一个类型化的浮点常量:

const foo float64 = 1e100

或任意位模式的浮点变量,如下所示:

var bar = math.Float64frombits(0x7ff8c0c0ac0ffee1)

但这是一个错误(“const初始化器......不是常量”):

const baz = math.Float64frombits(0x7ff8c0c0ac0ffee1)

如何声明任意位模式的类型化浮点数?

3 个答案:

答案 0 :(得分:3)

如果要存储位值(基本上是 numberlist[i-1].Substring(0, 1); ),并将其作为uint64提供给外部包,则可以提供“常量”功能,您可以保证只返回常量值。这正是math.NaN等函数的工作原理。

float64

答案 1 :(得分:2)

您对Math.Float64frombits的调用发生在运行时,而不是编译时,因此不是常量。从有效的Go页面(这将比我更好地解释):

  

Go中的常量只是常量。它们是在编译时创建的   时间,即使在函数中被定义为本地人,也只能是   数字,字符串或布尔值。由于编译时限制,   定义它们的表达式必须是常量表达式,   可由编译器评估。例如,1 <&lt; 3是常数   表达式,而math.Sin(math.Pi / 4)不是因为函数调用   to math.Sin需要在运行时发生。

链接:https://golang.org/doc/effective_go.html#constants

答案 2 :(得分:1)

您不能在常量声明中调用Float64frombits之类的函数;函数调用意味着它不能在编译时完全评估,因此它不能用作常量。但是,您可以将位转储为浮点值:

const myFloat float64 = 0x7ff8c0c0ac0ffee1

func main() {
    fmt.Println(myFloat)
}