2013-04-22 13 views
6

次GOプログラムを整数に切り捨てられ定数はエラーを与える:GO LANG

./fft.go:13: constant -6.28319 truncated to integer 
./fft.go:13: cannot use -7 * k/N (type int) as type float64 in assignment 

プログラム:

package main 

import (
    "math" 
    "fmt" 
) 

func main() { 
    fmt.Println("Hello world ",math.E) 

    var k, N int = 1, 10 
    var ans float64 = 0 
    var c float64 = (-2.0 * math.Pi * k)/N 
    x := make([]float64,N) 
    for i := 0; i < len(x); i++ { 
     x[i] = 1 
    } 
    ans = 0 
    for i := 0; i < N; i++ { 
     ans += x[i] * math.E 
    } 
    fmt.Println(ans) 
} 

なぜカント私はfloat64の種類にintを使用できますか?

+0

私は実際にこれらの非常に素晴らしいgolangエラーメッセージを掘る...彼らは議論だけでなく、マシンの人々が含まれますマシンとのチャット...どのような喜びでも他の言語で書いていることに比べて...そしてもっと積極的にゴランコードを書いてくれるよ。 –

答えて

10

specを引用する

var c float64 = (-2.0 * math.Pi * float64(k))/float64(N) 

によって

var c float64 = (-2.0 * math.Pi * k)/N 

を交換してください:

Conversions are required when different numeric types are mixed in an expression or assignment. For instance, int32 and int are not the same type even though they may have the same size on a particular architecture.

Goは静的型付けを使用すると、自動的に数値型の間で変換しません。理由はおそらくいくつかのエラーを避けるためです。たとえば、どのような価値とタイプがfloat64(2.5) * int(2)に必要なのでしょうか?結果はint(5)であるべきですか? int(4)float64(5.0)? Goでは、これは問題ではありません。 Go FAQにはmore to sayがあります。


この場合には、以下が十分である、と指摘@jnml:

var c float64 = -2 * math.Pi/float64(N) 
+0

'c:= -2 * math.Pi/float64(N)'で十分だ – zzzz

+3

この場合、はい。しかし、私は、この特定のプログラムを動作させることについてではなく、質問は入力に関するものだと思う。ですから、 'c:= ...'はより良いコードですが、私は答えを少し混乱させると思います。 – scvalex

+0

Ehmは、 'c:='部分を無視します。それはちょうど習慣外です。ポイントは、 'float64'の3つのインスタンスのうちの2つは余分であり、' k * floatConst'は整数 'k'を使用できます - これは理想的な数です。 – zzzz