2013-07-10 10 views

Antwort

14

Hier sind die Strukturdefinitionen:

// A Word represents a single digit of a multi-precision unsigned integer. 
type Word uintptr 

type nat []Word 

type Int struct { 
    neg bool // sign 
    abs nat // absolute value of the integer 
} 

type Rat struct { 
    // To make zero values for Rat work w/o initialization, 
    // a zero value of b (len(b) == 0) acts like b == 1. 
    // a.neg determines the sign of the Rat, b.neg is ignored. 
    a, b Int 
} 

Es gibt keine explizite Grenze. Das Limit ist Ihr Speicher oder theoretisch die maximale Array-Größe (2^31 oder 2^63, abhängig von Ihrer Plattform).


Wenn Sie praktische Bedenken haben, können Sie durch die in http://golang.org/src/pkg/math/big/nat_test.go gemacht Tests interessiert sein, zum Beispiel die, wo 10^100000 ist gebenchmarkt.

und Sie können leicht diese Art von Programm ausführen:

package main 

import (
    "fmt" 
    "math/big" 
) 

func main() { 
    verybig := big.NewInt(1) 
    ten := big.NewInt(10) 
    for i:=0; i<100000; i++ { 
     verybig.Mul(verybig, ten) 
    } 
    fmt.Println(verybig) 
} 

(wenn Sie wollen, dass es schnell genug für Go Spielplatz laufen, use a smaller exponent than 100000)

Das Problem wird nicht die maximale Größe sein, aber der verwendete Speicher und die Zeit, die solche Berechnungen benötigen.

+1

Bei der Verwendung von 'math/big' sollten Sie versuchen, unnötige' große.Int' Zuordnungen zu vermeiden (insbesondere wenn sie in den Heap flüchten). Das obige kann schneller und einfacher gemacht werden, indem "temp" eliminiert wird, um den Schleifenkörper einfach zu machen: "sehr groß.Mul (sehr groß, zehn)". –

+0

Danke @DaveC. Bewirb deinen Vorschlag. –