2017-04-08 5 views
-2

Ich muss Operationen ausführen, wie Potenzierung und Division auf große Werte von Int64 in Go, aber ich habe Probleme mit Überlauf. Ich habe versucht, sie in float64 umzuwandeln, aber dann stoße ich auf andere Probleme. Hier ist was ich versucht habe.Wie arbeite ich mit großen Ganzzahlen in Go?

Ich habe eine Integer-Variable, die ich in eine float64 umwandeln musste, um das handliche Mathe-Paket zu verwenden (https://golang.org/pkg/math).

Es wird jedoch nicht richtig umgesetzt, wenn die Integer-Variable zu groß ist. Ich nehme an, es liegt daran, dass die Größe größer ist als float64. ex:

fmt.Printf("%f",float64(111111111111111110)) //Outputs 111111111111111104.000000 

Ich versuche math.Mod, math.Pow10 und math.Log10 zu verwenden. Wie könnte ich die folgende Logik machen, aber mit einer großen Zahl, wie oben gezeigt?

int(math.Mod(float64(123)/math.Pow10(1),10))) // Gets the second digit 
+0

Mögliche Duplikat von [Warum sind Gleitkommazahlen ungenau?] (http://stackoverflow.com/questions/21895756/why-are-floating-point-numbers-inaccurate) –

+0

Es stellt sich heraus, dass das OP nicht die Absicht hatte, nach Floating zu fragen überhaupt Punkte, also ist es kein Duplikat dieser Frage. – Zoyd

Antwort

3

Die Frage ist mir nicht ganz klar, aber ich nehme an, Sie Operationen auf großen ganzen Zahlen durchführen wollen und wurden nur als Versuch mit float64.

In diesem Fall ist das richtige Werkzeug die math/big package. Hier ist, wie es zu verwenden, um die n-te Nachkommastelle eines int64 zu extrahieren:

// first digit is n=0 
func nthDigit(i int64, n int64) int64 { 
    var quotient big.Int 
    quotient.Exp(big.NewInt(10), big.NewInt(n), nil) 

    bigI := big.NewInt(i) 
    bigI.Div(bigI, &quotient) 

    var result big.Int 
    result.Mod(bigI, big.NewInt(10)) 

    return result.Int64() 
} 
+0

Sorry für die schlechte Formulierung der Frage, aber danke, dass du mich im richtigen Paket angegeben hast! Mir ist aufgefallen, dass dieses Paket keine Log-Funktion hat, kann ich das auch mit großen Ints machen (um zB die Anzahl der Ziffern in i zu erhalten)? – WCGPR0

+1

Es gibt zwar kein Protokoll, aber es gibt BitLen und lb (n) = BitLen (n) -1 (lb = binärer Logarithmus). Von dort Log (n) = lb (n)/lb (10). – Zoyd

+0

Ich habe die Frage so bearbeitet, dass sie widerspiegelt, was Sie fragen wollten. Dies erleichtert die spätere Suche nach dieser Frage. Natürlich können Sie es immer noch bearbeiten, wenn Sie meinen, dass meine Bearbeitung nicht das war, was Sie sagen wollten. – Zoyd

2

Sie können versuchen, die int Zeichenfolge zu konvertieren, und dann holen die Ziffern in der konvertierten Zeichenkette,

// n >= 1 
func NthDigit(num int, n int) int { 
    return int(strconv.Itoa(num)[n-1]) - int('0') 
}