math
Before You Start
- Applies to: Go 1.21+ (examples verified with Go 1.22) · Prerequisites: Base: Data Types · Read time: about 10 min
math is the basic mathematical operation library in Go, and it is a library that must be mastered and used proficiently.
Integer Constants
go
const (
intSize = 32 << (^uint(0) >> 63) // 32 or 64
MaxInt = 1<<(intSize-1) - 1
MinInt = -1 << (intSize - 1)
MaxInt8 = 1<<7 - 1
MinInt8 = -1 << 7
MaxInt16 = 1<<15 - 1
MinInt16 = -1 << 15
MaxInt32 = 1<<31 - 1
MinInt32 = -1 << 31
MaxInt64 = 1<<63 - 1
MinInt64 = -1 << 63
MaxUint = 1<<intSize - 1
MaxUint8 = 1<<8 - 1
MaxUint16 = 1<<16 - 1
MaxUint32 = 1<<32 - 1
MaxUint64 = 1<<64 - 1
)Floating Point Constants
go
const (
MaxFloat32 = 0x1p127 * (1 + (1 - 0x1p-23)) // 3.40282346638528859811704183484516925440e+38
SmallestNonzeroFloat32 = 0x1p-126 * 0x1p-23 // 1.401298464324817070923729583289916131280e-45
MaxFloat64 = 0x1p1023 * (1 + (1 - 0x1p-52)) // 1.79769313486231570814527423731704356798070e+308
SmallestNonzeroFloat64 = 0x1p-1022 * 0x1p-52 // 4.9406564584124654417656879286822137236505980e-324
)Mathematical Constants
go
const (
E = 2.71828182845904523536028747135266249775724709369995957496696763 // https://oeis.org/A001113
Pi = 3.14159265358979323846264338327950288419716939937510582097494459 // https://oeis.org/A000796
Phi = 1.61803398874989484820458683436563811772030917980576286213544862 // https://oeis.org/A001622
Sqrt2 = 1.41421356237309504880168872420969807856967187537694807317667974 // https://oeis.org/A002193
SqrtE = 1.64872127070012814684865078781416357165377610071014801157507931 // https://oeis.org/A019774
SqrtPi = 1.77245385090551602729816748334114518279754945612238712821380779 // https://oeis.org/A002161
SqrtPhi = 1.27201964951406896425242246173749149171560804184009624861664038 // https://oeis.org/A139339
Ln2 = 0.693147180559945309417232121458176568075500134360255254120680009 // https://oeis.org/A002162
Log2E = 1 / Ln2
Ln10 = 2.30258509299404568401799145468436420760110148862877297603332790 // https://oeis.org/A002392
Log10E = 1 / Ln10
)Maximum Value
go
func TestMax(t *testing.T) {
fmt.Println(math.Max(1.0, 2.0))
}=== RUN TestMax
2
--- PASS: TestMax (0.00s)
PASSMinimum Value
go
func TestMin(t *testing.T) {
fmt.Println(math.Min(1.0, 2.0))
}=== RUN TestMin
1
--- PASS: TestMin (0.00s)
PASSAbsolute Value
go
func TestAbs(t *testing.T) {
fmt.Println(math.Abs(-1))
}=== RUN TestAbs
1
--- PASS: TestAbs (0.00s)
PASSRemainder
go
func TestMod(t *testing.T) {
fmt.Println(math.Mod(1, 10))
fmt.Println(math.Mod(12, 10))
}=== RUN TestMod
1
2
--- PASS: TestMod (0.00s)
PASSNaN Detection
go
func TestName(t *testing.T) {
fmt.Println(math.IsNaN(math.NaN()))
}=== RUN TestFloor
2
--- PASS: TestFloor (0.00s)
PASSInf Detection
go
func TestInf(t *testing.T) {
fmt.Println(math.IsInf(1.0, 1))
fmt.Println(math.IsInf(math.Inf(-1), -1))
}=== RUN TestInf
false
true
--- PASS: TestInf (0.00s)
PASSTruncate
go
func TestTrunc(t *testing.T) {
fmt.Println(math.Trunc(1.26))
fmt.Println(math.Trunc(2.3333))
}=== RUN TestTrunc
1
2
--- PASS: TestTrunc (0.00s)
PASSFloor
go
func TestFloor(t *testing.T) {
fmt.Println(math.Floor(2.5))
}=== RUN TestFloor
2
--- PASS: TestFloor (0.00s)
PASSCeiling
go
func TestCeil(t *testing.T) {
fmt.Println(math.Ceil(2.5))
}=== RUN TestCeil
3
--- PASS: TestCeil (0.00s)
PASSRound
go
func TestRound(t *testing.T) {
fmt.Println(math.Round(1.2389))
fmt.Println(math.Round(-5.2389))
}=== RUN TestRound
1
-5
--- PASS: TestRound (0.00s)
PASSLogarithm
go
func TestLog(t *testing.T) {
fmt.Println(math.Log(100) / math.Log(10))
fmt.Println(math.Log(1) / math.Log(2))
}=== RUN TestLog
2
0
--- PASS: TestLog (0.00s)
PASSE Exponent
go
func TestEx(t *testing.T) {
fmt.Println(math.Exp(2))
}=== RUN TestEx
7.38905609893065
--- PASS: TestEx (0.00s)
PASSPower
go
func TestPow(t *testing.T) {
fmt.Println(math.Pow(2, 3))
fmt.Println(math.Pow(3, 3))
}=== RUN TestPow
8
27
--- PASS: TestPow (0.00s)
PASSSquare Root
go
func TestSqrt(t *testing.T) {
fmt.Println(math.Sqrt(4))
}=== RUN TestSqrt
2
--- PASS: TestSqrt (0.00s)
PASSCube Root
go
func TestCube(t *testing.T) {
fmt.Println(math.Cbrt(8))
fmt.Println(math.Cbrt(27))
}=== RUN TestCube
2
3
--- PASS: TestCube (0.00s)
PASSNth Root
go
func TestN(t *testing.T) {
fmt.Println(math.Round(math.Pow(8, 1.0/3)))
fmt.Println(math.Round(math.Pow(100, 1.0/2)))
}=== RUN TestN
2
10
--- PASS: TestN (0.00s)
PASSSin
go
func TestSin(t *testing.T) {
fmt.Println(math.Sin(0))
fmt.Println(math.Sin(20))
}=== RUN TestSin
0
0.9129452507276277
--- PASS: TestSin (0.00s)
PASSCos
go
func TestCos(t *testing.T) {
fmt.Println(math.Cos(0))
fmt.Println(math.Cos(20))
}=== RUN TestCos
1
0.40808206181339196
--- PASS: TestCos (0.00s)
PASSTan
go
func TestTan(t *testing.T) {
fmt.Println(math.Tan(0))
fmt.Println(math.Tan(20))
}=== RUN TestTan
0
2.2371609442247427
--- PASS: TestTan (0.00s)
PASSTIP
The math package contains far more functions than those listed above, but it is already sufficient for daily use. If you need to delve deeper, you can read the source code yourself.
Complete Example
The program below runs as-is: copy it into a file and execute go run main.go, or paste it into the Go Playground.
go
package main
import (
"fmt"
"math"
)
func main() {
fmt.Printf("%.4f\n", math.Sqrt2)
fmt.Println(math.Max(3, 7))
fmt.Println(math.Pow(2, 10))
fmt.Println(math.Floor(2.9), math.Ceil(2.1))
fmt.Println(math.IsNaN(math.NaN()))
}Expected output:
text
1.4142
7
1024
2 3
trueCommon Pitfalls
- Floating point equality is unreliable. Compare
math.Abs(a-b) < 1e-9instead ofa == b. - NaN is never equal to itself. Use
math.IsNaN; usemath.IsInffor infinities. - Arguments are
float64. Convert integers before callingPow,Sqrtand friends. - Integer limits live here too. Constants such as
math.MaxInt(Go 1.17+) are handy for bounds checks. - Rounding modes differ.
Floor/Ceilreturn floats; convert only after you have decided the rounding direction.
Change Log
- 2026-10-14: Added "Before You Start" notes, a complete runnable example with expected output, common pitfalls, and this change log.
