2017-06-13 7 views
2

私はこのように入力されたフロート定数を宣言することができます。任意のビットパターンの浮動型Go定数を宣言するにはどうすればよいですか?ゴーで

const foo float64 = 1e100 

またはこのような任意のビットパターンのフロート変数:

var bar = math.Float64frombits(0x7ff8c0c0ac0ffee1) 

しかし、これはエラー(「constの初期化子です...さ定数ではありません):

const baz = math.Float64frombits(0x7ff8c0c0ac0ffee1) 

任意のビットパターンの浮動小数点定数を宣言するにはどうすればよいですか?

+0

あなたは 'uint64'定数として保存し、必要に応じてそれを変換することができます(数学パッケージは内部的にそれをしない方法である) – JimB

+0

実際に良い提案です。依存パッケージが 'math'をインポートする必要があるので、輸出された値(例えば、センチネル値として使用されるもの)では少し厄介ですが、少なくともそれは確実性を保証します。 – cpcallen

答えて

2

Math.Float64frombitsへの呼び出しは、コンパイル時ではなく実行時に発生するため、定数ではありません。有効なGoページ(これは私よりも上手く説明できます)から:

Goの定数は定数です。関数内のローカルとして定義されていても、コンパイル時には の時刻に作成され、数値、文字列またはブール値は にしかなりません。コンパイル時の制限のため、 これらを定義する式は、コンパイラによって評価可能な定数式である でなければなりません。たとえば、1 < < 3は定数 の式ですが、math.Sin(math.Pi/4)は、実行時に という関数呼び出しが必要なためではありません。

リンク:https://golang.org/doc/effective_go.html#constants

+0

私はそれを理解しています。しかし、それは質問に答えることはできません。 (私はその質問への答えが "go language change proposal"を提出するかもしれないと思うが、私がそれをする前に何かを逃していないことを確かめたい) – cpcallen

1

あなたは定数宣言でFloat64frombitsのような関数を呼び出すことはできません。関数呼び出しは、コンパイル時に完全に評価することができないので、定数として使用することはできません。あなたは(基本的にuint64である)ビットの値を格納し、外部のパッケージへfloat64として利用できるようにしたい場合は、あなたが提供することができ、

const myFloat float64 = 0x7ff8c0c0ac0ffee1 

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

それはfloat64にビット単位の表現を適用しない。本質的に 'float64(0x7ff8c0c0ac0ffee1)' – JimB

+0

はい、正しいです。質問は、入力からの出力として期待されているものの詳細については特定していなかったので、const値を任意の16進値から設定するための唯一のオプションを与えました。 – Adrian

+1

質問は、 'Float64frombits'と同等の結果を指定します。任意の16進数値を数値的にfloat64に変換することは、uint64ビットをfloat64として解釈することと同じではありません。 – JimB

3

:あなたは、しかし、ちょうどfloat値にビットをダンプすることができます一定値を返すことだけを保証する「定数」関数。これは正確にmath.NaNのような機能がどのように機能するかです。

const uintFoo = 0x7ff8c0c0ac0ffee1 

func ConstFoo() float64 { 
    return math.Float64frombits(uintFoo) 
} 
関連する問題