arithmetic.go 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. package lib
  2. import (
  3. "math"
  4. "math/big"
  5. )
  6. func CheckFloat(x float64) float64 {
  7. if math.IsNaN(x) {
  8. panic("Float Overflow: NaN")
  9. }
  10. if math.IsInf(x, 0) {
  11. panic("Float Overflow: Infinity")
  12. }
  13. return x
  14. }
  15. var ArithmeticFunctions = map[string] interface{} {
  16. "plus": func(a *big.Int, b *big.Int) *big.Int {
  17. var c big.Int
  18. return c.Add(a, b)
  19. },
  20. "minus": func(a *big.Int, b *big.Int) *big.Int {
  21. var c big.Int
  22. return c.Sub(a, b)
  23. },
  24. "times": func(a *big.Int, b *big.Int) *big.Int {
  25. var c big.Int
  26. return c.Mul(a, b)
  27. },
  28. "quorem": func(a *big.Int, b *big.Int) (*big.Int, *big.Int) {
  29. var q, m big.Int
  30. q.QuoRem(a, b, &m)
  31. return &q, &m
  32. },
  33. "divmod": func(a *big.Int, b *big.Int) (*big.Int, *big.Int) {
  34. var q, m big.Int
  35. q.DivMod(a, b, &m)
  36. return &q, &m
  37. },
  38. "+float": func(a float64, b float64) float64 {
  39. return CheckFloat(a + b)
  40. },
  41. "-float": func(a float64, b float64) float64 {
  42. return CheckFloat(a - b)
  43. },
  44. "*float": func(a float64, b float64) float64 {
  45. return CheckFloat(a * b)
  46. },
  47. "/float": func(a float64, b float64) float64 {
  48. return CheckFloat(a / b)
  49. },
  50. "%float": func(a float64, b float64) float64 {
  51. return CheckFloat(math.Mod(a, b))
  52. },
  53. "+int8": func(a int8, b int8) int8 {
  54. return a + b
  55. },
  56. "-int8": func(a int8, b int8) int8 {
  57. return a - b
  58. },
  59. "*int8": func(a int8, b int8) int8 {
  60. return a * b
  61. },
  62. "/int8": func(a int8, b int8) int8 {
  63. return a / b
  64. },
  65. "%int8": func(a int8, b int8) int8 {
  66. return a % b
  67. },
  68. "+uint8": func(a uint8, b uint8) uint8 {
  69. return a + b
  70. },
  71. "-uint8": func(a uint8, b uint8) uint8 {
  72. return a - b
  73. },
  74. "*uint8": func(a uint8, b uint8) uint8 {
  75. return a * b
  76. },
  77. "/uint8": func(a uint8, b uint8) uint8 {
  78. return a / b
  79. },
  80. "%uint8": func(a uint8, b uint8) uint8 {
  81. return a % b
  82. },
  83. "+int16": func(a int16, b int16) int16 {
  84. return a + b
  85. },
  86. "-int16": func(a int16, b int16) int16 {
  87. return a - b
  88. },
  89. "*int16": func(a int16, b int16) int16 {
  90. return a * b
  91. },
  92. "/int16": func(a int16, b int16) int16 {
  93. return a / b
  94. },
  95. "%int16": func(a int16, b int16) int16 {
  96. return a % b
  97. },
  98. "+uint16": func(a uint16, b uint16) uint16 {
  99. return a + b
  100. },
  101. "-uint16": func(a uint16, b uint16) uint16 {
  102. return a - b
  103. },
  104. "*uint16": func(a uint16, b uint16) uint16 {
  105. return a * b
  106. },
  107. "/uint16": func(a uint16, b uint16) uint16 {
  108. return a / b
  109. },
  110. "%uint16": func(a uint16, b uint16) uint16 {
  111. return a % b
  112. },
  113. "+int32": func(a int32, b int32) int32 {
  114. return a + b
  115. },
  116. "-int32": func(a int32, b int32) int32 {
  117. return a - b
  118. },
  119. "*int32": func(a int32, b int32) int32 {
  120. return a * b
  121. },
  122. "/int32": func(a int32, b int32) int32 {
  123. return a / b
  124. },
  125. "%int32": func(a int32, b int32) int32 {
  126. return a % b
  127. },
  128. "+uint32": func(a uint32, b uint32) uint32 {
  129. return a + b
  130. },
  131. "-uint32": func(a uint32, b uint32) uint32 {
  132. return a - b
  133. },
  134. "*uint32": func(a uint32, b uint32) uint32 {
  135. return a * b
  136. },
  137. "/uint32": func(a uint32, b uint32) uint32 {
  138. return a / b
  139. },
  140. "%uint32": func(a uint32, b uint32) uint32 {
  141. return a % b
  142. },
  143. "+int64": func(a int64, b int64) int64 {
  144. return a + b
  145. },
  146. "-int64": func(a int64, b int64) int64 {
  147. return a - b
  148. },
  149. "*int64": func(a int64, b int64) int64 {
  150. return a * b
  151. },
  152. "/int64": func(a int64, b int64) int64 {
  153. return a / b
  154. },
  155. "%int64": func(a int64, b int64) int64 {
  156. return a % b
  157. },
  158. "+uint64": func(a uint64, b uint64) uint64 {
  159. return a + b
  160. },
  161. "-uint64": func(a uint64, b uint64) uint64 {
  162. return a - b
  163. },
  164. "*uint64": func(a uint64, b uint64) uint64 {
  165. return a * b
  166. },
  167. "/uint64": func(a uint64, b uint64) uint64 {
  168. return a / b
  169. },
  170. "%uint64": func(a uint64, b uint64) uint64 {
  171. return a % b
  172. },
  173. "+float64": func(a float64, b float64) float64 {
  174. return a + b
  175. },
  176. "-float64": func(a float64, b float64) float64 {
  177. return a - b
  178. },
  179. "*float64": func(a float64, b float64) float64 {
  180. return a * b
  181. },
  182. "/float64": func(a float64, b float64) float64 {
  183. return a / b
  184. },
  185. "%float64": func(a float64, b float64) float64 {
  186. return math.Mod(a, b)
  187. },
  188. }