2013-07-10 18 views

risposta

14

Qui ci sono le definizioni delle strutture:

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

non c'è limite esplicito. Il limite sarà la tua memoria o, teoricamente, la dimensione massima dell'array (2^31 o 2^63, a seconda della tua piattaforma).


Se hai dubbi pratici, si potrebbe essere interessati dai test effettuati in http://golang.org/src/pkg/math/big/nat_test.go, per esempio quello in cui 10^100000 è valutato.

E si può facilmente eseguire questo tipo di programma:

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

(se si desidera che venga eseguito abbastanza veloce per Go Playground, use a smaller exponent than 100000)

Il problema non sarà la dimensione massima, ma la memoria utilizzata e il tempo impiegato da tali calcoli.

+1

Quando si utilizza 'math/big', si dovrebbe cercare di evitare inutili allocazioni' big.Int' (in particolare se escono dall'heap). Quanto sopra può essere reso più veloce e più semplice eliminando 'temp' facendo semplicemente il body del loop:' verybig.Mul (verybig, ten) '. –

+0

Grazie a @DaveC. Applica il tuo suggerimento. –

Problemi correlati