arith

package
v0.0.0-...-f699923 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Dec 17, 2013 License: MIT Imports: 5 Imported by: 0

Documentation

Overview

パッケージ arith は int32, float64, Rat ("math/big" の無限多倍長有理数) の自動的な相互変換を伴う算術演算を実装する. int32 の演算を内部的に int64 で行うことで桁あふれ時の Rat への自動的な 変換を実現する.

Index

Examples

Constants

This section is empty.

Variables

This section is empty.

Functions

func Compare

func Compare(a, b Number) int

比較: a, b について a が b に対して小さい/等しい/大きいとき, それぞれ -1/0/1 を返す。Compare(7, 2) => 1

Example
r := Compare(7, 7)
Printf("%T %v\n", r, r)
r = Compare(7, 2)
Printf("%T %v\n", r, r)
r = Compare(2, 7)
Printf("%T %v\n", r, r)
r = Compare(7, 2.0)
Printf("%T %v\n", r, r)
r = Compare(7, NewRat(2, 1))
Printf("%T %v\n", r, r)
r = Compare(7.0, 2)
Printf("%T %v\n", r, r)
r = Compare(7.0, 2.0)
Printf("%T %v\n", r, r)
r = Compare(7.0, NewRat(2, 1))
Printf("%T %v\n", r, r)
r = Compare(NewRat(7, 1), 2)
Printf("%T %v\n", r, r)
r = Compare(NewRat(7, 1), 2.0)
Printf("%T %v\n", r, r)
r = Compare(NewRat(7, 1), 7)
Printf("%T %v\n", r, r)
r = Compare(NewRat(7, 2), NewRat(2, 3))
Printf("%T %v\n", r, r)
r = Compare(NewRat(2, 3), NewRat(7, 2))
Printf("%T %v\n", r, r)
Output:

int 0
int 1
int -1
int 1
int 1
int 1
int 1
int 1
int 1
int 1
int 0
int 1
int -1

func Float64

func Float64(a Number) float64

数を浮動小数点数にした値を返す。Float64(7) => 7.0

Example
r := Float64(7)
Printf("%T %v\n", r, r)
r = Float64(7.0)
Printf("%T %v\n", r, r)
r = Float64(NewRat(7, 1))
Printf("%T %v\n", r, r)
r = Float64(NewRat(-7, 2))
Printf("%T %v\n", r, r)
Output:

float64 7
float64 7
float64 7
float64 -3.5

func IsNumber

func IsNumber(a interface{}) bool

int32, float64 または *Rat ならば true を返す。

Example
Println(IsNumber(int32(7)))
Println(IsNumber(7.0))
Println(IsNumber(NewRat(7, 2)))
Println(IsNumber("7"))
Println(IsNumber(int64(7)))
Output:

true
true
true
false
false

func String

func String(a Number) string

数の文字列表現を得る。String(7.0) => "7.0"

Example
r := String(7)
Printf("%T %v\n", r, r)
r = String(int32(7))
Printf("%T %v\n", r, r)
r = String(int64(7))
Printf("%T %v\n", r, r)
r = String(7.0)
Printf("%T %v\n", r, r)
r = String(NewRat(7, 1))
Printf("%T %v\n", r, r)
r = String(NewRat(7, 2))
Printf("%T %v\n", r, r)
r = String(7.2)
Printf("%T %v\n", r, r)
r = String(7e20)
Printf("%T %v\n", r, r)
r = String(-7.0)
Printf("%T %v\n", r, r)
r = String(-7.2)
Printf("%T %v\n", r, r)
z, _ := new(Rat).SetString("123456789012345678901234567890")
r = String(z)
Printf("%T %v\n", r, r)
Output:

string 7
string 7
string 7
string 7.0
string 7
string 7/2
string 7.2
string 7e+20
string -7.0
string -7.2
string 123456789012345678901234567890

Types

type Number

type Number interface{}

Number は int32, float64 または *Rat を表す型であるとする (実際の型検査は実行時に行う)。 ただし,関数の引数としては便宜のため int, int64 も許す (それらは実行時の値によって int32 または *Rat へと変換される)。

Example (Factorial)
var n Number = 1
for i := 1; i < 30; i++ {
	n = Multiply(n, i)
	Println(String(n))
}
Output:

1
2
6
24
120
720
5040
40320
362880
3628800
39916800
479001600
6227020800
87178291200
1307674368000
20922789888000
355687428096000
6402373705728000
121645100408832000
2432902008176640000
51090942171709440000
1124000727777607680000
25852016738884976640000
620448401733239439360000
15511210043330985984000000
403291461126605635584000000
10888869450418352160768000000
304888344611713860501504000000
8841761993739701954543616000000

func Add

func Add(a, b Number) Number

加算: Add(7, 2) => 9

Example
r := Add(7, 2)
Printf("%T %v\n", r, r)
r = Add(7, 2.0)
Printf("%T %v\n", r, r)
r = Add(7, NewRat(2, 1))
Printf("%T %v\n", r, r)
r = Add(7.0, 2)
Printf("%T %v\n", r, r)
r = Add(7.0, 2.0)
Printf("%T %v\n", r, r)
r = Add(7.0, NewRat(2, 1))
Printf("%T %v\n", r, r)
r = Add(NewRat(7, 1), 2)
Printf("%T %v\n", r, r)
r = Add(NewRat(7, 1), 2.0)
Printf("%T %v\n", r, r)
r = Add(NewRat(7, 1), NewRat(2, 1))
Printf("%T %v\n", r, r)
r = Add(NewRat(7, 2), NewRat(2, 3))
Printf("%T %v\n", r, r)
Output:

int32 9
float64 9
int32 9
float64 9
float64 9
float64 9
int32 9
float64 9
int32 9
*big.Rat 25/6

func DivideInt

func DivideInt(a, b Number) Number

整数除算: DivideInt(7, 2) => 3

Example
r := DivideInt(7, 2)
Printf("%T %v\n", r, r)
r = DivideInt(7, 2.0)
Printf("%T %v\n", r, r)
r = DivideInt(7, NewRat(2, 1))
Printf("%T %v\n", r, r)
r = DivideInt(7.0, 2)
Printf("%T %v\n", r, r)
r = DivideInt(7.0, 2.0)
Printf("%T %v\n", r, r)
r = DivideInt(7.0, NewRat(2, 1))
Printf("%T %v\n", r, r)
r = DivideInt(NewRat(7, 1), 2)
Printf("%T %v\n", r, r)
r = DivideInt(NewRat(7, 1), 2.0)
Printf("%T %v\n", r, r)
r = DivideInt(NewRat(7, 1), NewRat(2, 1))
Printf("%T %v\n", r, r)
r = DivideInt(NewRat(7, 2), NewRat(2, 3))
Printf("%T %v\n", r, r)
Output:

int32 3
int32 3
int32 3
int32 3
int32 3
int32 3
int32 3
int32 3
int32 3
int32 5

func DivideReal

func DivideReal(a, b Number) Number

実数除算: DivideReal(7, 2) => 7/2

Example
r := DivideReal(7, 2)
Printf("%T %v\n", r, r)
r = DivideReal(7, 2.0)
Printf("%T %v\n", r, r)
r = DivideReal(7, NewRat(2, 1))
Printf("%T %v\n", r, r)
r = DivideReal(7.0, 2)
Printf("%T %v\n", r, r)
r = DivideReal(7.0, 2.0)
Printf("%T %v\n", r, r)
r = DivideReal(7.0, NewRat(2, 1))
Printf("%T %v\n", r, r)
r = DivideReal(NewRat(7, 1), 2)
Printf("%T %v\n", r, r)
r = DivideReal(NewRat(7, 1), 2.0)
Printf("%T %v\n", r, r)
r = DivideReal(NewRat(7, 1), NewRat(2, 1))
Printf("%T %v\n", r, r)
r = DivideReal(NewRat(7, 2), NewRat(2, 3))
Printf("%T %v\n", r, r)
Output:

*big.Rat 7/2
float64 3.5
*big.Rat 7/2
float64 3.5
float64 3.5
float64 3.5
*big.Rat 7/2
float64 3.5
*big.Rat 7/2
*big.Rat 21/4

func Multiply

func Multiply(a, b Number) Number

乗算: Multiply(7, 2) => 14

Example
r := Multiply(7, 2)
Printf("%T %v\n", r, r)
r = Multiply(7, 2.0)
Printf("%T %v\n", r, r)
r = Multiply(7, NewRat(2, 1))
Printf("%T %v\n", r, r)
r = Multiply(7.0, 2)
Printf("%T %v\n", r, r)
r = Multiply(7.0, 2.0)
Printf("%T %v\n", r, r)
r = Multiply(7.0, NewRat(2, 1))
Printf("%T %v\n", r, r)
r = Multiply(NewRat(7, 1), 2)
Printf("%T %v\n", r, r)
r = Multiply(NewRat(7, 1), 2.0)
Printf("%T %v\n", r, r)
r = Multiply(NewRat(7, 1), NewRat(2, 1))
Printf("%T %v\n", r, r)
r = Multiply(NewRat(7, 2), NewRat(2, 3))
Printf("%T %v\n", r, r)
Output:

int32 14
float64 14
int32 14
float64 14
float64 14
float64 14
int32 14
float64 14
int32 14
*big.Rat 7/3

func Subtract

func Subtract(a, b Number) Number

減算: Subtract(7, 2) => 5

Example
r := Subtract(7, 2)
Printf("%T %v\n", r, r)
r = Subtract(7, 2.0)
Printf("%T %v\n", r, r)
r = Subtract(7, NewRat(2, 1))
Printf("%T %v\n", r, r)
r = Subtract(7.0, 2)
Printf("%T %v\n", r, r)
r = Subtract(7.0, 2.0)
Printf("%T %v\n", r, r)
r = Subtract(7.0, NewRat(2, 1))
Printf("%T %v\n", r, r)
r = Subtract(NewRat(7, 1), 2)
Printf("%T %v\n", r, r)
r = Subtract(NewRat(7, 1), 2.0)
Printf("%T %v\n", r, r)
r = Subtract(NewRat(7, 1), NewRat(2, 1))
Printf("%T %v\n", r, r)
r = Subtract(NewRat(7, 2), NewRat(2, 3))
Printf("%T %v\n", r, r)
Output:

int32 5
float64 5
int32 5
float64 5
float64 5
float64 5
int32 5
float64 5
int32 5
*big.Rat 17/6

func Truncate

func Truncate(a Number) Number

数をゼロの方向へ丸めた整数を返す。Truncate(7.2) => 7

Example
r := Truncate(7)
Printf("%T %v\n", r, r)
r = Truncate(int32(7))
Printf("%T %v\n", r, r)
r = Truncate(int64(7))
Printf("%T %v\n", r, r)
r = Truncate(7.0)
Printf("%T %v\n", r, r)
r = Truncate(NewRat(7, 1))
Printf("%T %v\n", r, r)
r = Truncate(NewRat(7, 2))
Printf("%T %v\n", r, r)
r = Truncate(NewRat(7000000000000, 2))
Printf("%T %v\n", r, r)
r = Truncate(-3.5)
Printf("%T %v\n", r, r)
r = Truncate(NewRat(-7, 2))
Printf("%T %v\n", r, r)
r = Truncate(2147483647.999)
Printf("%T %v\n", r, r)
r = Truncate(2147483648.000)
Printf("%T %v\n", r, r)
r = Truncate(-2147483648.999)
Printf("%T %v\n", r, r)
r = Truncate(-2147483649.000)
Printf("%T %v\n", r, r)
r = Truncate(math.Inf(1))
Printf("%T %v\n", r, r)
Output:

int32 7
int32 7
int32 7
int32 7
int32 7
int32 3
*big.Rat 3500000000000/1
int32 -3
int32 -3
int32 2147483647
*big.Rat 2147483648/1
int32 -2147483648
*big.Rat -2147483649/1
float64 +Inf

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL