2017-06-13 56 views
2

在去我可以声明类型化浮动常数是这样的:我该如何声明一个任意位模式的float型常量?

const foo float64 = 1e100 

或任意位模式的这样一个浮点型变量:

var bar = math.Float64frombits(0x7ff8c0c0ac0ffee1) 

但这是一个错误(“常量初始...是不是一个常数“):

const baz = math.Float64frombits(0x7ff8c0c0ac0ffee1) 

我该如何声明一个任意位模式的类型化的float const?

+0

你可以将它保存为一个'uint64'不变,并将其转换需求(这是数学包是怎么做的内部) – JimB

+0

这实际上是一个很好的建议。对于导出的值(例如用作标记值的值)有点恼人,因为依赖包也需要导入'数学',但至少它确保了常量。 – cpcallen

回答

2

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

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

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

+0

我明白这一点。但它没有回答这个问题。 (我认为这个问题的答案可能是“提交语言改变提案”,但我想确保在我这样做之前我没有遗漏任何东西。) – cpcallen

1

不能调用就像在一个常量声明Float64frombits的功能;函数调用意味着它不能在编译时完全评估,所以它不能用作常量。你可以,但是,只转储位转换成一个float值:

const myFloat float64 = 0x7ff8c0c0ac0ffee1 

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

这并不适用于float64的按位表示,它是基本上'float64(0x7ff8c0c0ac0ffee1)' – JimB

+0

是的,这是正确的。问题没有具体说明他们期望从输入中得到的输出的细节,所以我给出了从任意十六进制值设置const值的唯一可用选项。 – Adrian

+1

该问题指定的结果等同于'Float64frombits'。数值上将任意十六进制值转换为float64与将uint64位解释为float64不同。 – JimB

3

如果你想存储的位值(这基本上是一个uint64),并使其可作为float64外部包,可以提供一个“常量”函数,你保证只返回常量值。这正是math.NaN这样的功能的工作原理。

const uintFoo = 0x7ff8c0c0ac0ffee1 

func ConstFoo() float64 { 
    return math.Float64frombits(uintFoo) 
} 
相关问题