2017-06-13 11 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) 
} 
相關問題