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

如何声明任意位模式的浮点型Go常量?,go,floating-point,bit-manipulation,constants,Go,Floating Point,Bit Manipulation,Constants,在Go中,我可以声明如下类型的浮点常量: const foo float64 = 1e100 var bar = math.Float64frombits(0x7ff8c0c0ac0ffee1) 或任意位模式的浮点变量,如下所示: const foo float64 = 1e100 var bar = math.Float64frombits(0x7ff8c0c0ac0ffee1) 但这是一个错误(“常量初始值设定项…不是常数”): 如何声明任意位模式的类型化浮点常量?对Math.Flo

在Go中,我可以声明如下类型的浮点常量:

const foo float64 = 1e100
var bar = math.Float64frombits(0x7ff8c0c0ac0ffee1)
或任意位模式的浮点变量,如下所示:

const foo float64 = 1e100
var bar = math.Float64frombits(0x7ff8c0c0ac0ffee1)
但这是一个错误(“常量初始值设定项…不是常数”):


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

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

Go中的常数就是那个常数。它们是在编译时创建的 时间,即使在函数中定义为局部变量,也只能 数字、字符串或布尔值。由于编译时间的限制, 定义它们的表达式必须是常量表达式,
可由编译器计算。例如,1您不能在常量声明中调用类似于
Float64frombits
的函数;函数调用意味着不能在编译时对其进行完全计算,因此不能将其用作常量。但是,您可以将位转储到浮点值中:

const myFloat float64 = 0x7ff8c0c0ac0ffee1

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

如果您想存储位值(本质上是一个
uint64
),并将其作为
float64
提供给外部软件包,则可以提供一个“常量”函数,保证只返回常量值。这正是功能类似于工作的方式


这不会对float64应用按位表示,它本质上是
float64(0x7ff8c0c0ac0ffee1)
Yes,这是正确的。问题并没有具体说明他们希望从输入输出什么,所以我给出了唯一可用的选项,用于从任意十六进制值设置常量值。问题指定的结果等效于
Float64frombits
。以数字方式将任意十六进制值转换为float64与将uint64位解释为float64不同。根据值的不同,可以使用适当的十六进制值使其等效。很难说,因为问题的示例
math.Float64frombits(0x7ff8c0c0ac0ffee1)
返回
NaN
。这是问题的一部分,位以NaN掩码值开始,不能作为float64文本写入。更不用说,由于十六进制文字只能是整数值,它们代表可能的float64值的一小部分,因此只能在非常有限的意义上进行近似。您可以将其存储为
uint64
常量,并根据需要对其进行转换(这是数学包内部的工作方式),这实际上是一个很好的建议。导出的值(例如用作sentinel值的值)有点烦人,因为依赖包还需要导入
数学
,但至少它确保了常量。我理解这一点。但它并没有回答这个问题。(我想这个问题的答案可能是“提交一份go语言更改建议”,但我想确保在提交之前没有遗漏任何内容。)