123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194 |
- package lib
- import (
- "math"
- "math/big"
- )
- func CheckFloat(x float64) float64 {
- if math.IsNaN(x) {
- panic("Float Overflow: NaN")
- }
- if math.IsInf(x, 0) {
- panic("Float Overflow: Infinity")
- }
- return x
- }
- var ArithmeticFunctions = map[string] interface{} {
- "plus": func(a *big.Int, b *big.Int) *big.Int {
- var c big.Int
- return c.Add(a, b)
- },
- "minus": func(a *big.Int, b *big.Int) *big.Int {
- var c big.Int
- return c.Sub(a, b)
- },
- "times": func(a *big.Int, b *big.Int) *big.Int {
- var c big.Int
- return c.Mul(a, b)
- },
- "quorem": func(a *big.Int, b *big.Int) (*big.Int, *big.Int) {
- var q, m big.Int
- q.QuoRem(a, b, &m)
- return &q, &m
- },
- "divmod": func(a *big.Int, b *big.Int) (*big.Int, *big.Int) {
- var q, m big.Int
- q.DivMod(a, b, &m)
- return &q, &m
- },
- "+float": func(a float64, b float64) float64 {
- return CheckFloat(a + b)
- },
- "-float": func(a float64, b float64) float64 {
- return CheckFloat(a - b)
- },
- "*float": func(a float64, b float64) float64 {
- return CheckFloat(a * b)
- },
- "/float": func(a float64, b float64) float64 {
- return CheckFloat(a / b)
- },
- "%float": func(a float64, b float64) float64 {
- return CheckFloat(math.Mod(a, b))
- },
- "+int8": func(a int8, b int8) int8 {
- return a + b
- },
- "-int8": func(a int8, b int8) int8 {
- return a - b
- },
- "*int8": func(a int8, b int8) int8 {
- return a * b
- },
- "/int8": func(a int8, b int8) int8 {
- return a / b
- },
- "%int8": func(a int8, b int8) int8 {
- return a % b
- },
- "+uint8": func(a uint8, b uint8) uint8 {
- return a + b
- },
- "-uint8": func(a uint8, b uint8) uint8 {
- return a - b
- },
- "*uint8": func(a uint8, b uint8) uint8 {
- return a * b
- },
- "/uint8": func(a uint8, b uint8) uint8 {
- return a / b
- },
- "%uint8": func(a uint8, b uint8) uint8 {
- return a % b
- },
- "+int16": func(a int16, b int16) int16 {
- return a + b
- },
- "-int16": func(a int16, b int16) int16 {
- return a - b
- },
- "*int16": func(a int16, b int16) int16 {
- return a * b
- },
- "/int16": func(a int16, b int16) int16 {
- return a / b
- },
- "%int16": func(a int16, b int16) int16 {
- return a % b
- },
- "+uint16": func(a uint16, b uint16) uint16 {
- return a + b
- },
- "-uint16": func(a uint16, b uint16) uint16 {
- return a - b
- },
- "*uint16": func(a uint16, b uint16) uint16 {
- return a * b
- },
- "/uint16": func(a uint16, b uint16) uint16 {
- return a / b
- },
- "%uint16": func(a uint16, b uint16) uint16 {
- return a % b
- },
- "+int32": func(a int32, b int32) int32 {
- return a + b
- },
- "-int32": func(a int32, b int32) int32 {
- return a - b
- },
- "*int32": func(a int32, b int32) int32 {
- return a * b
- },
- "/int32": func(a int32, b int32) int32 {
- return a / b
- },
- "%int32": func(a int32, b int32) int32 {
- return a % b
- },
- "+uint32": func(a uint32, b uint32) uint32 {
- return a + b
- },
- "-uint32": func(a uint32, b uint32) uint32 {
- return a - b
- },
- "*uint32": func(a uint32, b uint32) uint32 {
- return a * b
- },
- "/uint32": func(a uint32, b uint32) uint32 {
- return a / b
- },
- "%uint32": func(a uint32, b uint32) uint32 {
- return a % b
- },
- "+int64": func(a int64, b int64) int64 {
- return a + b
- },
- "-int64": func(a int64, b int64) int64 {
- return a - b
- },
- "*int64": func(a int64, b int64) int64 {
- return a * b
- },
- "/int64": func(a int64, b int64) int64 {
- return a / b
- },
- "%int64": func(a int64, b int64) int64 {
- return a % b
- },
- "+uint64": func(a uint64, b uint64) uint64 {
- return a + b
- },
- "-uint64": func(a uint64, b uint64) uint64 {
- return a - b
- },
- "*uint64": func(a uint64, b uint64) uint64 {
- return a * b
- },
- "/uint64": func(a uint64, b uint64) uint64 {
- return a / b
- },
- "%uint64": func(a uint64, b uint64) uint64 {
- return a % b
- },
- "+float64": func(a float64, b float64) float64 {
- return a + b
- },
- "-float64": func(a float64, b float64) float64 {
- return a - b
- },
- "*float64": func(a float64, b float64) float64 {
- return a * b
- },
- "/float64": func(a float64, b float64) float64 {
- return a / b
- },
- "%float64": func(a float64, b float64) float64 {
- return math.Mod(a, b)
- },
- }
|