inc., leading Card Processing team Writing Go for 2.5 years as a main language Spoke at Go Conference 2021 Spring as well Loves music, DJ’ing and bathhouse/sauna 1. Introduction 5
換される( そのため、代入時にoverflow したりする) func main() { const a = 111111111111111111111 var _ = a } $ go run main.go constant 111111111111111111111 overflows int 3. Go の組み込みの小数の挙動 27
a := 0.1 fmt.Println(a * a) b := new(big.Float).SetPrec(1024).SetFloat64(a*a) fmt.Println(b) } $ go run main.go 0.010000000000000002 0.010000000000000001942890293094023945741355419158935546875 4. Go の小数計算のアプローチ - 2. math/big Float 36
10) // 0.1 y := new(big.Rat).SetInt64(3) // 3 r := x.Mul(x, y) // x も更新される fmt.Printf("%v * %v = %v", x, y, r) } x も上書きされている $ go run main.go 3/10 * 3/1 = 3/10 4. Go の小数計算のアプローチ - 3. math/big Rat 41
decimal.NewFromInt(3) c, _ := decimal.NewFromString("0.3") fmt.Printf("a * b = %v\n", a.Mul(b)) fmt.Printf("c: %v\n", c) fmt.Printf("a * b == c: %t\n", a.Mul(b).Equal(c)) } $ go run main.go a * b = 0.3 c: 0.3 a * b == c: true 4. Go の小数計算のアプローチ - 3.shopspring/decimal 44
Language Specification https://golang.org/ref/spec The Go Blog Constants https://go.dev/blog/constants 754-2019 - IEEE Standard for Floating-Point Arithmetic https://ieeexplore.ieee.org/document/8766229 51