Big Numbers
If you need to deal with numbers beyond modern CPU can handle (as in, beyond uint64
or int64
), you need the big number package. This package handles mainly 3 types of big numbers:
- big integer
- big float
- big rational numbers
There are something to note is that these big numbers are a type of structure objects. Hence, normal arithmetic calculation will be using its internal functions rather than our conventional way of performing arithmetic calculations.
Create The Big Number
Creating the big number is quite straight-forward depending on how big the number is. Most of the time, you would want to translate from String (since you can't use any primitive number types).
Create Big Int
For big integer, to create from string would be using SetString
function:
i := new(big.Int)
i.SetString("1180591620717411303424", 10)
Create Big Float
For big float, to create from string would be using SetString
function:
i := new(big.Float)
i.SetString("1180591620717411303424")
Create Big Rational Numbers / Big Fraction
For big rational numbers, to create from string would be using SetString
function:
i := new(big.Rat)
i.SetString("1180591620717411303424/43121243546437465891334573467")
The string is expressed in mathematical form where the divider is between the dividend and divisor.
Read The Big Number
All 3 of them has an internal function String()
. That is how you read the value from it.
Quick and Easy
var x := i.String()
Formatting
fmt.Printf("%v\n", i)
Update The Big Number
There are various ways to do arithmetic with the big numbers, some are advanced mathematics calculations like squaring 2 big numbers, bit-wise operations, etc. You need to consult the documentation for those operations. Here, we only show the basic types of calculations:
Add
Adding 2 big numbers uses the Add(x, y TYPE)
function. Different big numbers has different add function. A big number can only perform addition to its own big number types. Here are some examples:
- Rational Numbers
i := new(big.Rat)
i.SetString("1/2")
i.Add(i, big.NewRat(1, 4)) // add 1/4
fmt.Printf("%v\n", i)
- Float
i := new(big.Float)
i.SetString("1e24")
i.Add(i, i)
fmt.Printf("%v\n", i)
- Integer
i := new(big.Int)
i.SetString("1180591620717411303424", 10)
i.Add(i, i)
fmt.Printf("%v\n", i)
Subtract
There is no function related to minus or subtraction. You need to use add and set the value to negative for addition. Example:
i := new(big.Int)
i.SetString("1180591620717411303424", 10)
i.Add(i, big.NewInt(-3000))
fmt.Printf("%v\n", i)
Multiply
Multiplication is available via the mul(x, y TYPE)
function. It allows large values output. Here are some examples:
- Rational Numbers
i := new(big.Rat)
i.SetString("1/2")
i.Mul(i, big.NewRat(1, 4)) // add 1/4
fmt.Printf("%v\n", i)
- Float
i := new(big.Float)
i.SetString("1e24")
i.Mul(i, i)
fmt.Printf("%v\n", i)
- Integer
i := new(big.Int)
i.SetString("1180591620717411303424", 10)
i.Mul(i, i)
fmt.Printf("%v\n", i)
Divide
Not all Big Numbers supports this function. You need to read the documentation and workaround those that does not with multiplication. Example, for rational number, you need to swap the dividend and divisor position before sending in for multiplications. Float does not support division.
- For Integer, here is an example:
i := new(big.Int)
i.SetString("1180591620717411303424", 10)
i.Div(i, i)
fmt.Printf("%v\n", i)
Others
There are some other functions available for each types of Big Numbers. Some of them are specialized to that Big Number. These are:
Not(...)
,Or(...)
,And(...)
,Xor(...)
- for bit-wise operations.Inv(...)
,Denom(...)
- for rational numbers specific calculations.Acc(...)
, - for float adjustment and specific calculations.
That's all about the big numbers in Go.