Program nyata hampir selalu bekerja dengan angka: menghitung akar, membulatkan harga, atau mengambil sampel acak. Package math menyediakan fungsi matematika untuk float64, mulai dari math.Pi sampai pembulatan dan nilai khusus NaN. Package math/rand/v2 membangkitkan bilangan acak semu yang dapat direproduksi lewat seed. Chapter ini membedah API inti keduanya dalam satu program dengan output identik di setiap eksekusi.

Fungsi dan Konstanta Dasar #

Seluruh fungsi math menerima dan mengembalikan float64. Tiga anggota paling sering dipakai adalah konstanta math.Pi, akar kuadrat math.Sqrt, dan nilai mutlak math.Abs. Data bertipe int harus dikonversi lebih dulu, misalnya math.Sqrt(float64(9)).

Fungsi math.Max dan math.Min membandingkan dua float64 dan mengembalikan yang lebih besar atau lebih kecil. Perbedaan dengan builtin max dan min hanya muncul pada kombinasi nilai khusus di bagian berikutnya.

Pembulatan: Floor, Ceil, Round, dan RoundToEven #

Empat fungsi pembulatan memilih arah yang berbeda. math.Floor membulatkan ke bawah dan math.Ceil ke atas. math.Round membulatkan ke terdekat, dengan kasus setengah (x.5) menjauh dari nol. math.RoundToEven juga membulatkan ke terdekat, tetapi kasus setengah memilih bilangan genap terdekat.

FungsiKasus seri x.5Contoh hasil
math.Floorselalu ke bawahFloor(2.9) menjadi 2
math.Ceilselalu ke atasCeil(2.1) menjadi 3
math.Roundmenjauh dari nolRound(2.5) menjadi 3, Round(-2.5) menjadi -3
math.RoundToEvenke genap terdekatRoundToEven(2.5) menjadi 2, RoundToEven(3.5) menjadi 4

Aturan genap dipakai di bidang keuangan dan statistik karena pembulatan berkali-kali tidak membiaskan rata-rata hasil.

NaN dan Tak Terhingga #

Standar IEEE 754 mendefinisikan dua nilai khusus: NaN (not a number) untuk hasil tak terdefinisi seperti nol dibagi nol, dan tak terhingga untuk nilai meluap. Fungsi math.NaN dan math.Inf(1) membuat nilai tersebut, sedangkan math.IsNaN dan math.IsInf memeriksa sebuah nilai. Nilai khusus juga menjelaskan perbedaan kecil antara math.Max dan builtin max: pada kombinasi NaN dan +Inf, math.Max mengembalikan +Inf sementara builtin max mengembalikan NaN.

Batas Bilangan Bulat #

Sejak Go 1.17, package math juga menyimpan konstanta batas tipe bilangan bulat: math.MaxInt bernilai 9223372036854775807 pada platform 64 bit, dan math.MinInt bernilai -9223372036854775808. Konstanta ini berguna sebagai nilai awal ketika mencari bilangan terbesar atau terkecil tanpa menghafal angka per platform. Untuk batas float tersedia math.MaxFloat64.

math/rand/v2 dan Seed PCG #

Generator bilangan acak di komputer bersifat semu (pseudorandom): deretnya tampak acak tetapi ditentukan penuh oleh nilai awal yang disebut seed. math/rand/v2 menyediakan dua sumber: PCG yang cepat dan ChaCha8 yang lebih tahan prediksi. Fungsi top-level seperti rand.IntN memakai sumber global berbasis ChaCha8 yang di-seed acak saat program dimulai, sehingga hasilnya berbeda pada setiap eksekusi.

Untuk hasil yang dapat direproduksi, buat generator mandiri dengan seed tetap:

go
rng := rand.New(rand.NewPCG(1, 2))

Variabel rng menghasilkan deret tetap untuk seed yang sama. rng.IntN(6) mengembalikan bilangan pada rentang setengah terbuka [0, 6) alias 0 sampai 5, sehingga simulasi dadu menambahkan satu. rng.Float64() menghasilkan pecahan pada [0, 1), dan rng.Shuffle mengacak urutan slice lewat fungsi penukar posisi.

Aspekmath/rand (v1)math/rand/v2
Seed globalrand.Seed (deprecated)tidak ada; sumber global otomatis acak
Nama fungsirand.Intn(10)rand.IntN(10)
Generator barurand.New(rand.NewSource(42))rand.New(rand.NewPCG(1, 2))
Status APIbanyak fungsi warisankonsisten, tanpa rand.Seed

Kode baru sebaiknya langsung memakai math/rand/v2 karena API-nya konsisten dan bebas fungsi deprecated seperti rand.Seed.

Program Utuh #

Berkas math-demo.go merangkai seluruh materi chapter:

go
package main

import (
	"fmt"
	"math"
	"math/rand/v2"
)

func main() {
	// Konstanta dan fungsi dasar package math.
	fmt.Println("pi       :", math.Pi)
	fmt.Println("sqrt     :", math.Sqrt(2))
	fmt.Println("abs      :", math.Abs(-7.5))
	fmt.Println("floor    :", math.Floor(3.7), math.Floor(-3.7))
	fmt.Println("ceil     :", math.Ceil(3.2), math.Ceil(-3.2))
	fmt.Println("round    :", math.Round(2.5), math.Round(3.5), math.Round(-2.5))
	fmt.Println("genap    :", math.RoundToEven(2.5), math.RoundToEven(3.5))
	fmt.Println("maks     :", math.Max(3, 9), "min:", math.Min(3, 9))

	// Nilai khusus bilangan titik mengambang: NaN dan tak terhingga.
	nan := math.NaN()
	inf := math.Inf(1)
	fmt.Println("isnan    :", math.IsNaN(nan), math.IsNaN(3.14))
	fmt.Println("isinf    :", math.IsInf(inf, 1), math.IsInf(3.14, 1))
	fmt.Println("inf      :", inf)

	// Batas atas dan bawah tipe int untuk platform ini.
	fmt.Println("maxint   :", math.MaxInt)
	fmt.Println("minint   :", math.MinInt)

	// rand/v2 dengan sumber PCG berseed: hasilnya tetap di setiap eksekusi.
	rng := rand.New(rand.NewPCG(1, 2))
	fmt.Println("dadu     :", rng.IntN(6)+1)
	fmt.Printf("float64  : %g\n", rng.Float64())

	// Shuffle mengacak urutan slice memakai rng yang sama.
	kartu := []string{"as", "dua", "tiga", "empat"}
	rng.Shuffle(len(kartu), func(i, j int) {
		kartu[i], kartu[j] = kartu[j], kartu[i]
	})
	fmt.Println("kartu    :", kartu)
}

Jalankan program dari folder chapter:

bash
go run math-demo.go

Output yang Dihasilkan:

text
pi       : 3.141592653589793
sqrt     : 1.4142135623730951
abs      : 7.5
floor    : 3 -4
ceil     : 4 -3
round    : 3 4 -3
genap    : 2 4
maks     : 9 min: 3
isnan    : true false
isinf    : true false
inf      : +Inf
maxint   : 9223372036854775807
minint   : -9223372036854775808
dadu     : 5
float64  : 0.4613862177205994
kartu    : [dua empat tiga as]

Mari kita telaah baris demi baris program di atas:

  1. Baris 4-6: tiga package diimpor — fmt untuk mencetak, math untuk fungsi matematika, dan math/rand/v2 untuk bilangan acak.
  2. Baris 11-15: konstanta dan fungsi dasar dicetak; Floor dan Ceil menerima kasus positif dan negatif agar arah pembulatannya terlihat.
  3. Baris 16-18: Round menggeser kasus setengah menjauh dari nol, RoundToEven memilih genap terdekat, dan Max/Min membandingkan dua angka.
  4. Baris 21-25: math.NaN dan math.Inf(1) membuat nilai khusus, lalu IsNaN dan IsInf memeriksanya berbanding angka biasa.
  5. Baris 28-29: batas math.MaxInt dan math.MinInt mengikuti lebar tipe int platform.
  6. Baris 32-34: rand.New(rand.NewPCG(1, 2)) membuat generator berseed tetap; IntN(6)+1 mensimulasikan dadu dan Float64 mengambil pecahan berikutnya.
  7. Baris 37-41: rng.Shuffle mengacak slice kartu lewat fungsi penukar dua indeks.

Referensi #

Angka untuk menghitung dan mengacak sudah lengkap di tangan Anda. Data yang dikumpulkan program sering kali perlu disusun agar mudah dibaca dan dicari; chapter berikutnya membahas package sort dan slices untuk mengurutkan koleksi, melakukan pencarian biner, sampai menyusun data menurut beberapa kunci sekaligus.

Berkas Sumber

Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.

math-demo.go

Unduh berkas
go
package main

import (
	"fmt"
	"math"
	"math/rand/v2"
)

func main() {
	// Konstanta dan fungsi dasar package math.
	fmt.Println("pi       :", math.Pi)
	fmt.Println("sqrt     :", math.Sqrt(2))
	fmt.Println("abs      :", math.Abs(-7.5))
	fmt.Println("floor    :", math.Floor(3.7), math.Floor(-3.7))
	fmt.Println("ceil     :", math.Ceil(3.2), math.Ceil(-3.2))
	fmt.Println("round    :", math.Round(2.5), math.Round(3.5), math.Round(-2.5))
	fmt.Println("genap    :", math.RoundToEven(2.5), math.RoundToEven(3.5))
	fmt.Println("maks     :", math.Max(3, 9), "min:", math.Min(3, 9))

	// Nilai khusus bilangan titik mengambang: NaN dan tak terhingga.
	nan := math.NaN()
	inf := math.Inf(1)
	fmt.Println("isnan    :", math.IsNaN(nan), math.IsNaN(3.14))
	fmt.Println("isinf    :", math.IsInf(inf, 1), math.IsInf(3.14, 1))
	fmt.Println("inf      :", inf)

	// Batas atas dan bawah tipe int untuk platform ini.
	fmt.Println("maxint   :", math.MaxInt)
	fmt.Println("minint   :", math.MinInt)

	// rand/v2 dengan sumber PCG berseed: hasilnya tetap di setiap eksekusi.
	rng := rand.New(rand.NewPCG(1, 2))
	fmt.Println("dadu     :", rng.IntN(6)+1)
	fmt.Printf("float64  : %g\n", rng.Float64())

	// Shuffle mengacak urutan slice memakai rng yang sama.
	kartu := []string{"as", "dua", "tiga", "empat"}
	rng.Shuffle(len(kartu), func(i, j int) {
		kartu[i], kartu[j] = kartu[j], kartu[i]
	})
	fmt.Println("kartu    :", kartu)
}