2013-04-22 18 views
6

następujący program GO daje błąd:GO lang - stała obcięta do liczby całkowitej

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

Program:

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) 
} 

Dlaczego nie mogę użyć int w rodzaju float64?

+0

naprawdę kopać te bardzo ładne komunikaty o błędach golang ... oni są osoby w dyskusji, nie tylko maszyna czatowanie z komputerem ... co za radość w porównaniu do pisania w jakimkolwiek innym języku ... i proaktywne, co sprawia, że ​​pisanie kodu golang jest o wiele bardziej zabawne –

Odpowiedz

10

Wymień

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

przez

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

zacytować spec:

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 wykorzystuje wpisywanie statyczne i nie automatycznej konwersji pomiędzy typami numerycznymi. Powodem jest prawdopodobnie uniknięcie błędów. Na przykład, jaką wartość i jaki typ powinien uzyskać plon float64(2.5) * int(2)? Czy wynik powinien być int(5)? int(4)? float64(5.0)? W Go, to nie jest problem. Go FAQ zawiera numer more to say.


@jnml zwraca uwagę, że w tym przypadku, po to wystarczy:

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

'c: = -2 * math.Pi/float64 (N)' wystarczy – zzzz

+3

W tym przypadku tak. Ale myślę, że chodzi o pisanie, a nie o to, żeby ten konkretny program działał. Tak więc, chociaż 'c: = ...' jest lepszym kodem, myślę, że to trochę myli odpowiedź. – scvalex

+0

Ehm, zignoruj ​​część "c: =", to po prostu z przyzwyczajenia. Chodzi o to, że dwa z trzech przypadków 'float64' są zbędne, a' k * floatConst' może używać liczby całkowitej "k" - jest to liczba "idealna". – zzzz

Powiązane problemy