diff --git a/builtins.go b/builtins.go index e08c5d2..c37a1d7 100644 --- a/builtins.go +++ b/builtins.go @@ -404,6 +404,14 @@ var builtinAcos = liftNumeric(math.Acos) var builtinAtan = liftNumeric(math.Atan) var builtinLog = liftNumeric(math.Log) var builtinExp = liftNumeric(math.Exp) +var builtinMantissa = liftNumeric(func(f float64) float64 { + mantissa, _ := math.Frexp(f) + return mantissa +}) +var builtinExponent = liftNumeric(func(f float64) float64 { + _, exponent := math.Frexp(f) + return float64(exponent) +}) func liftBitwise(f func(int64, int64) int64) func(*evaluator, potentialValue, potentialValue) (value, error) { return func(e *evaluator, xp, yp potentialValue) (value, error) { @@ -604,6 +612,8 @@ var funcBuiltins = map[string]evalCallable{ "atan": &UnaryBuiltin{name: "atan", function: builtinAtan, parameters: ast.Identifiers{"x"}}, "log": &UnaryBuiltin{name: "log", function: builtinLog, parameters: ast.Identifiers{"x"}}, "exp": &UnaryBuiltin{name: "exp", function: builtinExp, parameters: ast.Identifiers{"x"}}, + "mantissa": &UnaryBuiltin{name: "mantissa", function: builtinMantissa, parameters: ast.Identifiers{"x"}}, + "exponent": &UnaryBuiltin{name: "exponent", function: builtinExponent, parameters: ast.Identifiers{"x"}}, "pow": &BinaryBuiltin{name: "pow", function: builtinPow, parameters: ast.Identifiers{"base", "exp"}}, "modulo": &BinaryBuiltin{name: "modulo", function: builtinModulo, parameters: ast.Identifiers{"x", "y"}}, } diff --git a/testdata/std.exponent.golden b/testdata/std.exponent.golden new file mode 100644 index 0000000..573541a --- /dev/null +++ b/testdata/std.exponent.golden @@ -0,0 +1 @@ +0 diff --git a/testdata/std.exponent.input b/testdata/std.exponent.input new file mode 100644 index 0000000..9f67739 --- /dev/null +++ b/testdata/std.exponent.input @@ -0,0 +1 @@ +std.exponent(0) diff --git a/testdata/std.exponent2.golden b/testdata/std.exponent2.golden new file mode 100644 index 0000000..1e8b314 --- /dev/null +++ b/testdata/std.exponent2.golden @@ -0,0 +1 @@ +6 diff --git a/testdata/std.exponent2.input b/testdata/std.exponent2.input new file mode 100644 index 0000000..87223e6 --- /dev/null +++ b/testdata/std.exponent2.input @@ -0,0 +1 @@ +std.exponent(42) diff --git a/testdata/std.exponent3.golden b/testdata/std.exponent3.golden new file mode 100644 index 0000000..29d6383 --- /dev/null +++ b/testdata/std.exponent3.golden @@ -0,0 +1 @@ +100 diff --git a/testdata/std.exponent3.input b/testdata/std.exponent3.input new file mode 100644 index 0000000..b235166 --- /dev/null +++ b/testdata/std.exponent3.input @@ -0,0 +1 @@ +std.exponent(1e30) diff --git a/testdata/std.exponent4.golden b/testdata/std.exponent4.golden new file mode 100644 index 0000000..e85087a --- /dev/null +++ b/testdata/std.exponent4.golden @@ -0,0 +1 @@ +31 diff --git a/testdata/std.exponent4.input b/testdata/std.exponent4.input new file mode 100644 index 0000000..17a1f3e --- /dev/null +++ b/testdata/std.exponent4.input @@ -0,0 +1 @@ +std.exponent(1 << 30) diff --git a/testdata/std.exponent5.golden b/testdata/std.exponent5.golden new file mode 100644 index 0000000..7facc89 --- /dev/null +++ b/testdata/std.exponent5.golden @@ -0,0 +1 @@ +36 diff --git a/testdata/std.exponent5.input b/testdata/std.exponent5.input new file mode 100644 index 0000000..01188d9 --- /dev/null +++ b/testdata/std.exponent5.input @@ -0,0 +1 @@ +std.exponent(42 << 30) diff --git a/testdata/std.exponent6.golden b/testdata/std.exponent6.golden new file mode 100644 index 0000000..d402039 --- /dev/null +++ b/testdata/std.exponent6.golden @@ -0,0 +1 @@ +-24 diff --git a/testdata/std.exponent6.input b/testdata/std.exponent6.input new file mode 100644 index 0000000..3b1b19a --- /dev/null +++ b/testdata/std.exponent6.input @@ -0,0 +1 @@ +std.exponent(42 / (1 << 30)) diff --git a/testdata/std.exponent7.golden b/testdata/std.exponent7.golden new file mode 100644 index 0000000..1e8b314 --- /dev/null +++ b/testdata/std.exponent7.golden @@ -0,0 +1 @@ +6 diff --git a/testdata/std.exponent7.input b/testdata/std.exponent7.input new file mode 100644 index 0000000..b5257fd --- /dev/null +++ b/testdata/std.exponent7.input @@ -0,0 +1 @@ +std.exponent(-42) diff --git a/testdata/std.mantissa.golden b/testdata/std.mantissa.golden new file mode 100644 index 0000000..573541a --- /dev/null +++ b/testdata/std.mantissa.golden @@ -0,0 +1 @@ +0 diff --git a/testdata/std.mantissa.input b/testdata/std.mantissa.input new file mode 100644 index 0000000..e4c1cb0 --- /dev/null +++ b/testdata/std.mantissa.input @@ -0,0 +1 @@ +std.mantissa(0) diff --git a/testdata/std.mantissa2.golden b/testdata/std.mantissa2.golden new file mode 100644 index 0000000..421856f --- /dev/null +++ b/testdata/std.mantissa2.golden @@ -0,0 +1 @@ +0.65625 diff --git a/testdata/std.mantissa2.input b/testdata/std.mantissa2.input new file mode 100644 index 0000000..8e741ee --- /dev/null +++ b/testdata/std.mantissa2.input @@ -0,0 +1 @@ +std.mantissa(42) diff --git a/testdata/std.mantissa3.golden b/testdata/std.mantissa3.golden new file mode 100644 index 0000000..a4a817c --- /dev/null +++ b/testdata/std.mantissa3.golden @@ -0,0 +1 @@ +0.83999999999999997 diff --git a/testdata/std.mantissa3.input b/testdata/std.mantissa3.input new file mode 100644 index 0000000..de02a0a --- /dev/null +++ b/testdata/std.mantissa3.input @@ -0,0 +1 @@ +std.mantissa(0.42) diff --git a/testdata/std.mantissa4.golden b/testdata/std.mantissa4.golden new file mode 100644 index 0000000..d1fcfa6 --- /dev/null +++ b/testdata/std.mantissa4.golden @@ -0,0 +1 @@ +0.5714936956411375 diff --git a/testdata/std.mantissa4.input b/testdata/std.mantissa4.input new file mode 100644 index 0000000..428706b --- /dev/null +++ b/testdata/std.mantissa4.input @@ -0,0 +1 @@ +std.mantissa(1e100) diff --git a/testdata/std.mantissa5.golden b/testdata/std.mantissa5.golden new file mode 100644 index 0000000..421856f --- /dev/null +++ b/testdata/std.mantissa5.golden @@ -0,0 +1 @@ +0.65625 diff --git a/testdata/std.mantissa5.input b/testdata/std.mantissa5.input new file mode 100644 index 0000000..55ac1c7 --- /dev/null +++ b/testdata/std.mantissa5.input @@ -0,0 +1 @@ +std.mantissa(42 << 30) diff --git a/testdata/std.mantissa6.golden b/testdata/std.mantissa6.golden new file mode 100644 index 0000000..421856f --- /dev/null +++ b/testdata/std.mantissa6.golden @@ -0,0 +1 @@ +0.65625 diff --git a/testdata/std.mantissa6.input b/testdata/std.mantissa6.input new file mode 100644 index 0000000..fd5eb96 --- /dev/null +++ b/testdata/std.mantissa6.input @@ -0,0 +1 @@ +std.mantissa(42 / (1 << 30)) diff --git a/testdata/std.mantissa7.golden b/testdata/std.mantissa7.golden new file mode 100644 index 0000000..4455f20 --- /dev/null +++ b/testdata/std.mantissa7.golden @@ -0,0 +1 @@ +-0.65625 diff --git a/testdata/std.mantissa7.input b/testdata/std.mantissa7.input new file mode 100644 index 0000000..3dafcd2 --- /dev/null +++ b/testdata/std.mantissa7.input @@ -0,0 +1 @@ +std.mantissa(-42)