2013-04-22 12 views
6

Il seguente programma GO dà l'errore:GO Lang - costante troncato a intero

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

Programma:

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

Perchè non uso un int in un tipo di float64?

+0

ho veramente scavare questi molto bello messaggi di errore golang ... essi comprendono le persone nella discussione, non solo la macchina chattare con la macchina ... che gioia rispetto alla scrittura in qualsiasi altra lingua ... e proattiva che rende la scrittura di codice golang molto più divertente –

risposta

10

Sostituire

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

da

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

Per citare il 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 utilizza tipizzazione statica e non converte automaticamente tra tipi numerici. Il motivo è probabilmente quello di evitare alcuni errori. Ad esempio, quale valore e che tipo dovrebbe produrre float64(2.5) * int(2)? Il risultato dovrebbe essere int(5)? int(4)? float64(5.0)? In Go, questo non è un problema. The Go FAQ ha more to say su questo.


@jnml fa notare che, in questo caso, il seguente è sufficiente:

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

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

+3

In questo caso, sì. Ma penso che la domanda riguardi la digitazione, non quella di far funzionare questo particolare programma. Quindi, anche se 'c: = ...' è un codice migliore, penso che confonda la risposta un po '. – scvalex

+0

Ehm, ignora la parte 'c: =', è solo per abitudine. Il punto era che due delle tre istanze di 'float64' sono superflue e' k * floatConst' può usare l'intero 'k' - è un numero" ideale ". – zzzz

Problemi correlati