123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211 |
- package otto
- import (
- "math"
- "math/rand"
- )
- // Math
- func builtinMathAbs(call FunctionCall) Value {
- number := call.Argument(0).float64()
- return float64Value(math.Abs(number))
- }
- func builtinMathAcos(call FunctionCall) Value {
- number := call.Argument(0).float64()
- return float64Value(math.Acos(number))
- }
- func builtinMathAcosh(call FunctionCall) Value {
- number := call.Argument(0).float64()
- return float64Value(math.Acosh(number))
- }
- func builtinMathAsin(call FunctionCall) Value {
- number := call.Argument(0).float64()
- return float64Value(math.Asin(number))
- }
- func builtinMathAsinh(call FunctionCall) Value {
- number := call.Argument(0).float64()
- return float64Value(math.Asinh(number))
- }
- func builtinMathAtan(call FunctionCall) Value {
- number := call.Argument(0).float64()
- return float64Value(math.Atan(number))
- }
- func builtinMathAtan2(call FunctionCall) Value {
- y := call.Argument(0).float64()
- if math.IsNaN(y) {
- return NaNValue()
- }
- x := call.Argument(1).float64()
- if math.IsNaN(x) {
- return NaNValue()
- }
- return float64Value(math.Atan2(y, x))
- }
- func builtinMathAtanh(call FunctionCall) Value {
- number := call.Argument(0).float64()
- return float64Value(math.Atanh(number))
- }
- func builtinMathCbrt(call FunctionCall) Value {
- number := call.Argument(0).float64()
- return float64Value(math.Cbrt(number))
- }
- func builtinMathCos(call FunctionCall) Value {
- number := call.Argument(0).float64()
- return float64Value(math.Cos(number))
- }
- func builtinMathCeil(call FunctionCall) Value {
- number := call.Argument(0).float64()
- return float64Value(math.Ceil(number))
- }
- func builtinMathCosh(call FunctionCall) Value {
- number := call.Argument(0).float64()
- return float64Value(math.Cosh(number))
- }
- func builtinMathExp(call FunctionCall) Value {
- number := call.Argument(0).float64()
- return float64Value(math.Exp(number))
- }
- func builtinMathExpm1(call FunctionCall) Value {
- number := call.Argument(0).float64()
- return float64Value(math.Expm1(number))
- }
- func builtinMathFloor(call FunctionCall) Value {
- number := call.Argument(0).float64()
- return float64Value(math.Floor(number))
- }
- func builtinMathLog(call FunctionCall) Value {
- number := call.Argument(0).float64()
- return float64Value(math.Log(number))
- }
- func builtinMathLog10(call FunctionCall) Value {
- number := call.Argument(0).float64()
- return float64Value(math.Log10(number))
- }
- func builtinMathLog1p(call FunctionCall) Value {
- number := call.Argument(0).float64()
- return float64Value(math.Log1p(number))
- }
- func builtinMathLog2(call FunctionCall) Value {
- number := call.Argument(0).float64()
- return float64Value(math.Log2(number))
- }
- func builtinMathMax(call FunctionCall) Value {
- switch len(call.ArgumentList) {
- case 0:
- return negativeInfinityValue()
- case 1:
- return float64Value(call.ArgumentList[0].float64())
- }
- result := call.ArgumentList[0].float64()
- if math.IsNaN(result) {
- return NaNValue()
- }
- for _, value := range call.ArgumentList[1:] {
- value := value.float64()
- if math.IsNaN(value) {
- return NaNValue()
- }
- result = math.Max(result, value)
- }
- return float64Value(result)
- }
- func builtinMathMin(call FunctionCall) Value {
- switch len(call.ArgumentList) {
- case 0:
- return positiveInfinityValue()
- case 1:
- return float64Value(call.ArgumentList[0].float64())
- }
- result := call.ArgumentList[0].float64()
- if math.IsNaN(result) {
- return NaNValue()
- }
- for _, value := range call.ArgumentList[1:] {
- value := value.float64()
- if math.IsNaN(value) {
- return NaNValue()
- }
- result = math.Min(result, value)
- }
- return float64Value(result)
- }
- func builtinMathPow(call FunctionCall) Value {
- // TODO Make sure this works according to the specification (15.8.2.13)
- x := call.Argument(0).float64()
- y := call.Argument(1).float64()
- if math.Abs(x) == 1 && math.IsInf(y, 0) {
- return NaNValue()
- }
- return float64Value(math.Pow(x, y))
- }
- func builtinMathRandom(call FunctionCall) Value {
- var v float64
- if call.runtime.random != nil {
- v = call.runtime.random()
- } else {
- v = rand.Float64() //nolint:gosec
- }
- return float64Value(v)
- }
- func builtinMathRound(call FunctionCall) Value {
- number := call.Argument(0).float64()
- value := math.Floor(number + 0.5)
- if value == 0 {
- value = math.Copysign(0, number)
- }
- return float64Value(value)
- }
- func builtinMathSin(call FunctionCall) Value {
- number := call.Argument(0).float64()
- return float64Value(math.Sin(number))
- }
- func builtinMathSinh(call FunctionCall) Value {
- number := call.Argument(0).float64()
- return float64Value(math.Sinh(number))
- }
- func builtinMathSqrt(call FunctionCall) Value {
- number := call.Argument(0).float64()
- return float64Value(math.Sqrt(number))
- }
- func builtinMathTan(call FunctionCall) Value {
- number := call.Argument(0).float64()
- return float64Value(math.Tan(number))
- }
- func builtinMathTanh(call FunctionCall) Value {
- number := call.Argument(0).float64()
- return float64Value(math.Tanh(number))
- }
- func builtinMathTrunc(call FunctionCall) Value {
- number := call.Argument(0).float64()
- return float64Value(math.Trunc(number))
- }
|