This is an automated email from the ASF dual-hosted git repository.
xiangfu pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/pinot.git
The following commit(s) were added to refs/heads/master by this push:
new becb57e064 Adding more arithmetic functions (#14671)
becb57e064 is described below
commit becb57e064f57ba230bbf3527fe08e66a60974db
Author: Xiang Fu <[email protected]>
AuthorDate: Sat Dec 21 21:25:23 2024 -0800
Adding more arithmetic functions (#14671)
---
.../function/scalar/ArithmeticFunctions.java | 78 +++-
.../data/function/ArithmeticFunctionsTest.java | 402 ++++++++++++++++++---
2 files changed, 429 insertions(+), 51 deletions(-)
diff --git
a/pinot-common/src/main/java/org/apache/pinot/common/function/scalar/ArithmeticFunctions.java
b/pinot-common/src/main/java/org/apache/pinot/common/function/scalar/ArithmeticFunctions.java
index 27c4952b1f..d27a3fa6cc 100644
---
a/pinot-common/src/main/java/org/apache/pinot/common/function/scalar/ArithmeticFunctions.java
+++
b/pinot-common/src/main/java/org/apache/pinot/common/function/scalar/ArithmeticFunctions.java
@@ -40,11 +40,59 @@ public class ArithmeticFunctions {
return (b == 0) ? defaultValue : a / b;
}
+ @ScalarFunction
+ public static long intDiv(double a, double b) {
+ return (long) Math.floor(a / b);
+ }
+
+ @ScalarFunction
+ public static long intDivOrZero(double a, double b) {
+ //Same as intDiv but returns zero when dividing by zero or when dividing a
minimal negative number by minus one.
+ return (b == 0 || (a == Long.MIN_VALUE && b == -1)) ? 0 : intDiv(a, b);
+ }
+
+ @ScalarFunction
+ public static int isFinite(double value) {
+ return Double.isFinite(value) ? 1 : 0;
+ }
+
+ @ScalarFunction
+ public static int isInfinite(double value) {
+ return Double.isInfinite(value) ? 1 : 0;
+ }
+
+ @ScalarFunction
+ public static double ifNotFinite(double valueToCheck, double defaultValue) {
+ return Double.isFinite(valueToCheck) ? valueToCheck : defaultValue;
+ }
+
+ @ScalarFunction
+ public static int isNaN(double value) {
+ return Double.isNaN(value) ? 1 : 0;
+ }
+
@ScalarFunction
public static double mod(double a, double b) {
return a % b;
}
+ @ScalarFunction
+ public static double moduloOrZero(double a, double b) {
+ //Same as mod but returns zero when dividing by zero or when dividing a
minimal negative number by minus one.
+ return (b == 0 || (a == Long.MIN_VALUE && b == -1)) ? 0 : mod(a, b);
+ }
+
+ @ScalarFunction
+ public static double positiveModulo(double a, double b) {
+ double result = a % b;
+ return result >= 0 ? result : result + Math.abs(b);
+ }
+
+ @ScalarFunction
+ public static double negate(double a) {
+ return -a;
+ }
+
@ScalarFunction
public static double least(double a, double b) {
return Double.min(a, b);
@@ -117,7 +165,6 @@ public class ArithmeticFunctions {
return Math.pow(a, exponent);
}
-
// Big Decimal Implementation has been used here to avoid overflows
// when multiplying by Math.pow(10, scale) for rounding
@ScalarFunction
@@ -143,4 +190,33 @@ public class ArithmeticFunctions {
public static double truncate(double a) {
return Math.signum(a) * Math.floor(Math.abs(a));
}
+
+ @ScalarFunction
+ public static long gcd(long a, long b) {
+ return a == 0 ? Math.abs(b) : gcd(b % a, a);
+ }
+
+ @ScalarFunction
+ public static long lcm(long a, long b) {
+ if (a == 0 || b == 0) {
+ return 0;
+ }
+ return Math.abs(a) / gcd(a, b) * Math.abs(b);
+ }
+
+ @ScalarFunction
+ public static double hypot(double a, double b) {
+ return Math.hypot(a, b);
+ }
+
+ @ScalarFunction
+ public static int byteswapInt(int a) {
+ return Integer.reverseBytes(a);
+ }
+
+ @ScalarFunction
+ public static long byteswapLong(long a) {
+ // Skip the heading 0s in the long value
+ return Long.reverseBytes(a);
+ }
}
diff --git
a/pinot-core/src/test/java/org/apache/pinot/core/data/function/ArithmeticFunctionsTest.java
b/pinot-core/src/test/java/org/apache/pinot/core/data/function/ArithmeticFunctionsTest.java
index 404444933e..61d62e4531 100644
---
a/pinot-core/src/test/java/org/apache/pinot/core/data/function/ArithmeticFunctionsTest.java
+++
b/pinot-core/src/test/java/org/apache/pinot/core/data/function/ArithmeticFunctionsTest.java
@@ -49,58 +49,360 @@ public class ArithmeticFunctionsTest {
@DataProvider(name = "arithmeticFunctionsDataProvider")
public Object[][] arithmeticFunctionsDataProvider() {
List<Object[]> inputs = new ArrayList<>();
+ // test add
+ {
+ GenericRow row = new GenericRow();
+ row.putValue("a", (byte) 1);
+ row.putValue("b", (char) 2);
+ inputs.add(new Object[]{"a + b", Lists.newArrayList("a", "b"), row,
3.0});
+ inputs.add(new Object[]{"add(a, b)", Lists.newArrayList("a", "b"), row,
3.0});
+ inputs.add(new Object[]{"plus(a, b)", Lists.newArrayList("a", "b"), row,
3.0});
+ }
+ // test subtract
+ {
+ GenericRow row = new GenericRow();
+ row.putValue("a", (short) 3);
+ row.putValue("b", 4);
+ inputs.add(new Object[]{"a - b", Lists.newArrayList("a", "b"), row,
-1.0});
+ }
+ // test multiply
+ {
+ GenericRow row = new GenericRow();
+ row.putValue("a", 5);
+ row.putValue("b", 6);
+ inputs.add(new Object[]{"a * b", Lists.newArrayList("a", "b"), row,
30.0});
+ inputs.add(new Object[]{"mult(a, b)", Lists.newArrayList("a", "b"), row,
30.0});
+ }
+ {
+ GenericRow row = new GenericRow();
+ row.putValue("a", 5L);
+ row.putValue("b", 6f);
+ inputs.add(new Object[]{"a * b", Lists.newArrayList("a", "b"), row,
30.0});
+ inputs.add(new Object[]{"mult(a, b)", Lists.newArrayList("a", "b"), row,
30.0});
+ }
+ // test divide
+ {
+ GenericRow row = new GenericRow();
+ row.putValue("a", 7.0);
+ row.putValue("b", 8);
+ inputs.add(new Object[]{"a / b", Lists.newArrayList("a", "b"), row,
0.875});
+ inputs.add(new Object[]{"div(a, b)", Lists.newArrayList("a", "b"), row,
0.875});
+ inputs.add(new Object[]{"divide(a, b)", Lists.newArrayList("a", "b"),
row, 0.875});
+ }
+ {
+ GenericRow row = new GenericRow();
+ row.putValue("a", 7.0);
+ row.putValue("b", "8");
+ inputs.add(new Object[]{"a / b", Lists.newArrayList("a", "b"), row,
0.875});
+ inputs.add(new Object[]{"div(a, b)", Lists.newArrayList("a", "b"), row,
0.875});
+ inputs.add(new Object[]{"divide(a, b)", Lists.newArrayList("a", "b"),
row, 0.875});
+ }
+ {
+ GenericRow row = new GenericRow();
+ row.putValue("a", 1.0);
+ row.putValue("b", "0.0001");
+ inputs.add(new Object[]{"intdiv(a, b)", Lists.newArrayList("a", "b"),
row, 10000L});
+ inputs.add(new Object[]{"intDivOrZero(a, b)", Lists.newArrayList("a",
"b"), row, 10000L});
+ }
+ {
+ GenericRow row = new GenericRow();
+ row.putValue("a", 1.0);
+ row.putValue("b", "0");
+ inputs.add(new Object[]{"divide(a, b, 0)", Lists.newArrayList("a", "b"),
row, 0.0});
+ inputs.add(new Object[]{"intDivOrZero(a, b)", Lists.newArrayList("a",
"b"), row, 0L});
+ }
+ // test isFinite
+ {
+ GenericRow row = new GenericRow();
+ row.putValue("a", 1.0);
+ inputs.add(new Object[]{"isFinite(a)", Lists.newArrayList("a"), row, 1});
+ }
+ {
+ GenericRow row = new GenericRow();
+ row.putValue("a", Double.POSITIVE_INFINITY);
+ inputs.add(new Object[]{"isFinite(a)", Lists.newArrayList("a"), row, 0});
+ }
+ {
+ GenericRow row = new GenericRow();
+ row.putValue("a", Double.NEGATIVE_INFINITY);
+ inputs.add(new Object[]{"isFinite(a)", Lists.newArrayList("a"), row, 0});
+ }
+ {
+ GenericRow row = new GenericRow();
+ row.putValue("a", Double.NaN);
+ inputs.add(new Object[]{"isFinite(a)", Lists.newArrayList("a"), row, 0});
+ }
+ // test isInfinite
+ {
+ GenericRow row = new GenericRow();
+ row.putValue("a", 1.0);
+ inputs.add(new Object[]{"isInfinite(a)", Lists.newArrayList("a"), row,
0});
+ }
+ {
+ GenericRow row = new GenericRow();
+ row.putValue("a", Double.POSITIVE_INFINITY);
+ inputs.add(new Object[]{"isInfinite(a)", Lists.newArrayList("a"), row,
1});
+ }
+ {
+ GenericRow row = new GenericRow();
+ row.putValue("a", Double.NEGATIVE_INFINITY);
+ inputs.add(new Object[]{"isInfinite(a)", Lists.newArrayList("a"), row,
1});
+ }
+ {
+ GenericRow row = new GenericRow();
+ row.putValue("a", Double.NaN);
+ inputs.add(new Object[]{"isInfinite(a)", Lists.newArrayList("a"), row,
0});
+ }
+ // test ifNotFinite
+ {
+ GenericRow row = new GenericRow();
+ row.putValue("a", 1.0);
+ inputs.add(new Object[]{"ifNotFinite(a, 2.0)", Lists.newArrayList("a"),
row, 1.0});
+ }
+ {
+ GenericRow row = new GenericRow();
+ row.putValue("a", Double.POSITIVE_INFINITY);
+ inputs.add(new Object[]{"ifNotFinite(a, 2.0)", Lists.newArrayList("a"),
row, 2.0});
+ }
+ {
+ GenericRow row = new GenericRow();
+ row.putValue("a", Double.NEGATIVE_INFINITY);
+ inputs.add(new Object[]{"ifNotFinite(a, 2.0)", Lists.newArrayList("a"),
row, 2.0});
+ }
+ {
+ GenericRow row = new GenericRow();
+ row.putValue("a", Double.NaN);
+ inputs.add(new Object[]{"ifNotFinite(a, 2.0)", Lists.newArrayList("a"),
row, 2.0});
+ }
+ // test isNaN
+ {
+ GenericRow row = new GenericRow();
+ row.putValue("a", 1.0);
+ inputs.add(new Object[]{"isNaN(a)", Lists.newArrayList("a"), row, 0});
+ }
+ {
+ GenericRow row = new GenericRow();
+ row.putValue("a", Double.POSITIVE_INFINITY);
+ inputs.add(new Object[]{"isNaN(a)", Lists.newArrayList("a"), row, 0});
+ }
+ {
+ GenericRow row = new GenericRow();
+ row.putValue("a", Double.NEGATIVE_INFINITY);
+ inputs.add(new Object[]{"isNaN(a)", Lists.newArrayList("a"), row, 0});
+ }
+ {
+ GenericRow row = new GenericRow();
+ row.putValue("a", Double.NaN);
+ inputs.add(new Object[]{"isNaN(a)", Lists.newArrayList("a"), row, 1});
+ }
+ // test mod
+ {
+ GenericRow row = new GenericRow();
+ row.putValue("a", 9);
+ row.putValue("b", 5);
+ inputs.add(new Object[]{"a % b", Lists.newArrayList("a", "b"), row,
4.0});
+ inputs.add(new Object[]{"mod(a, b)", Lists.newArrayList("a", "b"), row,
4.0});
+ inputs.add(new Object[]{"moduloOrZero(a, b)", Lists.newArrayList("a",
"b"), row, 4.0});
+ }
+ // test moduloOrZero
+ {
+ GenericRow row = new GenericRow();
+ row.putValue("a", 9);
+ row.putValue("b", 0);
+ inputs.add(new Object[]{"moduloOrZero(a, b)", Lists.newArrayList("a",
"b"), row, 0.0});
+ }
+ // test positiveModulo
+ {
+ GenericRow row = new GenericRow();
+ row.putValue("a", 9);
+ row.putValue("b", 5);
+ inputs.add(new Object[]{"positiveModulo(a, b)", Lists.newArrayList("a",
"b"), row, 4.0});
+ }
+ {
+ GenericRow row = new GenericRow();
+ row.putValue("a", 9);
+ row.putValue("b", -5);
+ inputs.add(new Object[]{"positiveModulo(a, b)", Lists.newArrayList("a",
"b"), row, 4.0});
+ }
+ {
+ GenericRow row = new GenericRow();
+ row.putValue("a", -9);
+ row.putValue("b", 5);
+ inputs.add(new Object[]{"positiveModulo(a, b)", Lists.newArrayList("a",
"b"), row, 1.0});
+ }
+ {
+ GenericRow row = new GenericRow();
+ row.putValue("a", -9);
+ row.putValue("b", -5);
+ inputs.add(new Object[]{"positiveModulo(a, b)", Lists.newArrayList("a",
"b"), row, 1.0});
+ }
+ // test negate
+ {
+ GenericRow row = new GenericRow();
+ row.putValue("a", 9);
+ inputs.add(new Object[]{"negate(a)", Lists.newArrayList("a"), row,
-9.0});
+ }
+ {
+ GenericRow row = new GenericRow();
+ row.putValue("a", -9);
+ inputs.add(new Object[]{"negate(a)", Lists.newArrayList("a"), row, 9.0});
+ }
- GenericRow row0 = new GenericRow();
- row0.putValue("a", (byte) 1);
- row0.putValue("b", (char) 2);
- inputs.add(new Object[]{"a + b", Lists.newArrayList("a", "b"), row0, 3.0});
-
- GenericRow row1 = new GenericRow();
- row1.putValue("a", (short) 3);
- row1.putValue("b", 4);
- inputs.add(new Object[]{"a - b", Lists.newArrayList("a", "b"), row1,
-1.0});
-
- GenericRow row2 = new GenericRow();
- row2.putValue("a", 5L);
- row2.putValue("b", 6f);
- inputs.add(new Object[]{"a * b", Lists.newArrayList("a", "b"), row2,
30.0});
-
- GenericRow row3 = new GenericRow();
- row3.putValue("a", 7.0);
- row3.putValue("b", "8");
- inputs.add(new Object[]{"a / b", Lists.newArrayList("a", "b"), row3,
0.875});
-
- GenericRow row4 = new GenericRow();
- row4.putValue("a", 9);
- row4.putValue("b", 5);
- inputs.add(new Object[]{"a % b", Lists.newArrayList("a", "b"), row4, 4.0});
-
- GenericRow row5 = new GenericRow();
- row5.putValue("a", 9);
- row5.putValue("b", 5);
- inputs.add(new Object[]{"least(a, b)", Lists.newArrayList("a", "b"), row5,
5.0});
- inputs.add(new Object[]{"greatest(a, b)", Lists.newArrayList("a", "b"),
row5, 9.0});
-
- GenericRow row6 = new GenericRow();
- row6.putValue("a", 9.5);
- inputs.add(new Object[]{"floor(a)", Lists.newArrayList("a"), row6, 9.0});
- inputs.add(new Object[]{"ceil(a)", Lists.newArrayList("a"), row6, 10.0});
- inputs.add(new Object[]{"exp(a)", Lists.newArrayList("a"), row6,
Math.exp(9.5)});
- inputs.add(new Object[]{"sqrt(a)", Lists.newArrayList("a"), row6,
Math.sqrt(9.5)});
- inputs.add(new Object[]{"ln(a)", Lists.newArrayList("a"), row6,
Math.log(9.5)});
- inputs.add(new Object[]{"log10(a)", Lists.newArrayList("a"), row6,
Math.log10(9.5)});
- inputs.add(new Object[]{"log2(a)", Lists.newArrayList("a"), row6,
Math.log(9.5) / Math.log(2.0)});
-
- GenericRow row7 = new GenericRow();
- row7.putValue("a", -9.5);
- inputs.add(new Object[]{"sign(a)", Lists.newArrayList("a"), row6, 1.0});
- inputs.add(new Object[]{"sign(a)", Lists.newArrayList("a"), row7, -1.0});
-
- GenericRow row8 = new GenericRow();
- row8.putValue("a", 9.5);
- row8.putValue("b", 0);
- inputs.add(new Object[]{"divide(a, b, 0)", Lists.newArrayList("a", "b"),
row8, 0.0});
+ // test least/greatest
+ {
+ GenericRow row = new GenericRow();
+ row.putValue("a", 9);
+ row.putValue("b", 5);
+ inputs.add(new Object[]{"least(a, b)", Lists.newArrayList("a", "b"),
row, 5.0});
+ inputs.add(new Object[]{"greatest(a, b)", Lists.newArrayList("a", "b"),
row, 9.0});
+ }
+ // test abs, sign, floor, ceil, exp, sqrt, ln, log10, log2, power
+ {
+ GenericRow row = new GenericRow();
+ row.putValue("a", 9.5);
+ row.putValue("b", -9.5);
+ inputs.add(new Object[]{"abs(a)", Lists.newArrayList("a"), row, 9.5});
+ inputs.add(new Object[]{"abs(b)", Lists.newArrayList("b"), row, 9.5});
+ inputs.add(new Object[]{"sign(a)", Lists.newArrayList("a"), row, 1.0});
+ inputs.add(new Object[]{"sign(b)", Lists.newArrayList("b"), row, -1.0});
+ inputs.add(new Object[]{"floor(a)", Lists.newArrayList("a"), row, 9.0});
+ inputs.add(new Object[]{"ceil(a)", Lists.newArrayList("a"), row, 10.0});
+ inputs.add(new Object[]{"exp(a)", Lists.newArrayList("a"), row,
Math.exp(9.5)});
+ inputs.add(new Object[]{"sqrt(a)", Lists.newArrayList("a"), row,
Math.sqrt(9.5)});
+ inputs.add(new Object[]{"ln(a)", Lists.newArrayList("a"), row,
Math.log(9.5)});
+ inputs.add(new Object[]{"log10(a)", Lists.newArrayList("a"), row,
Math.log10(9.5)});
+ inputs.add(new Object[]{"log2(a)", Lists.newArrayList("a"), row,
Math.log(9.5) / Math.log(2.0)});
+ inputs.add(new Object[]{"power(a, 2)", Lists.newArrayList("a"), row, 9.5
* 9.5});
+ }
+ // test roundDecimal
+ {
+ GenericRow row = new GenericRow();
+ row.putValue("a", 9.5);
+ inputs.add(new Object[]{"roundDecimal(a)", Lists.newArrayList("a"), row,
10.0});
+ inputs.add(new Object[]{"roundDecimal(a, 0)", Lists.newArrayList("a"),
row, 10.0});
+ inputs.add(new Object[]{"roundDecimal(a, 1)", Lists.newArrayList("a"),
row, 9.5});
+ inputs.add(new Object[]{"roundDecimal(a, 2)", Lists.newArrayList("a"),
row, 9.5});
+ inputs.add(new Object[]{"roundDecimal(a, 3)", Lists.newArrayList("a"),
row, 9.5});
+ }
+ {
+ GenericRow row = new GenericRow();
+ row.putValue("a", 9.4);
+ inputs.add(new Object[]{"roundDecimal(a)", Lists.newArrayList("a"), row,
9.0});
+ inputs.add(new Object[]{"roundDecimal(a, 0)", Lists.newArrayList("a"),
row, 9.0});
+ inputs.add(new Object[]{"roundDecimal(a, 1)", Lists.newArrayList("a"),
row, 9.4});
+ inputs.add(new Object[]{"roundDecimal(a, 2)", Lists.newArrayList("a"),
row, 9.4});
+ inputs.add(new Object[]{"roundDecimal(a, 3)", Lists.newArrayList("a"),
row, 9.4});
+ }
+ {
+ GenericRow row = new GenericRow();
+ row.putValue("a", 9.6);
+ inputs.add(new Object[]{"roundDecimal(a)", Lists.newArrayList("a"), row,
10.0});
+ inputs.add(new Object[]{"roundDecimal(a, 0)", Lists.newArrayList("a"),
row, 10.0});
+ inputs.add(new Object[]{"roundDecimal(a, 1)", Lists.newArrayList("a"),
row, 9.6});
+ inputs.add(new Object[]{"roundDecimal(a, 2)", Lists.newArrayList("a"),
row, 9.6});
+ inputs.add(new Object[]{"roundDecimal(a, 3)", Lists.newArrayList("a"),
row, 9.6});
+ }
+ {
+ GenericRow row = new GenericRow();
+ row.putValue("a", 9.45);
+ inputs.add(new Object[]{"roundDecimal(a)", Lists.newArrayList("a"), row,
9.0});
+ inputs.add(new Object[]{"roundDecimal(a, 1)", Lists.newArrayList("a"),
row, 9.5});
+ inputs.add(new Object[]{"roundDecimal(a, 2)", Lists.newArrayList("a"),
row, 9.45});
+ inputs.add(new Object[]{"roundDecimal(a, 3)", Lists.newArrayList("a"),
row, 9.45});
+ }
+ {
+ GenericRow row = new GenericRow();
+ row.putValue("a", 9.46);
+ inputs.add(new Object[]{"roundDecimal(a)", Lists.newArrayList("a"), row,
9.0});
+ inputs.add(new Object[]{"roundDecimal(a, 1)", Lists.newArrayList("a"),
row, 9.5});
+ inputs.add(new Object[]{"roundDecimal(a, 2)", Lists.newArrayList("a"),
row, 9.46});
+ inputs.add(new Object[]{"roundDecimal(a, 3)", Lists.newArrayList("a"),
row, 9.46});
+ }
+ // test truncate
+ {
+ GenericRow row = new GenericRow();
+ row.putValue("a", 9.5);
+ inputs.add(new Object[]{"truncate(a)", Lists.newArrayList("a"), row,
9.0});
+ inputs.add(new Object[]{"truncate(a, 0)", Lists.newArrayList("a"), row,
9.0});
+ inputs.add(new Object[]{"truncate(a, 1)", Lists.newArrayList("a"), row,
9.5});
+ inputs.add(new Object[]{"truncate(a, 2)", Lists.newArrayList("a"), row,
9.5});
+ inputs.add(new Object[]{"truncate(a, 3)", Lists.newArrayList("a"), row,
9.5});
+ }
+ {
+ GenericRow row = new GenericRow();
+ row.putValue("a", 9.4);
+ inputs.add(new Object[]{"truncate(a)", Lists.newArrayList("a"), row,
9.0});
+ inputs.add(new Object[]{"truncate(a, 0)", Lists.newArrayList("a"), row,
9.0});
+ inputs.add(new Object[]{"truncate(a, 1)", Lists.newArrayList("a"), row,
9.4});
+ inputs.add(new Object[]{"truncate(a, 2)", Lists.newArrayList("a"), row,
9.4});
+ inputs.add(new Object[]{"truncate(a, 3)", Lists.newArrayList("a"), row,
9.4});
+ }
+ {
+ GenericRow row = new GenericRow();
+ row.putValue("a", 9.6);
+ inputs.add(new Object[]{"truncate(a)", Lists.newArrayList("a"), row,
9.0});
+ inputs.add(new Object[]{"truncate(a, 0)", Lists.newArrayList("a"), row,
9.0});
+ inputs.add(new Object[]{"truncate(a, 1)", Lists.newArrayList("a"), row,
9.6});
+ inputs.add(new Object[]{"truncate(a, 2)", Lists.newArrayList("a"), row,
9.6});
+ inputs.add(new Object[]{"truncate(a, 3)", Lists.newArrayList("a"), row,
9.6});
+ }
+ {
+ GenericRow row = new GenericRow();
+ row.putValue("a", 9.45);
+ inputs.add(new Object[]{"truncate(a)", Lists.newArrayList("a"), row,
9.0});
+ inputs.add(new Object[]{"truncate(a, 1)", Lists.newArrayList("a"), row,
9.4});
+ inputs.add(new Object[]{"truncate(a, 2)", Lists.newArrayList("a"), row,
9.45});
+ inputs.add(new Object[]{"truncate(a, 3)", Lists.newArrayList("a"), row,
9.45});
+ }
+ // test gcd, lcm
+ {
+ GenericRow row = new GenericRow();
+ row.putValue("a", 9L);
+ row.putValue("b", 6L);
+ inputs.add(new Object[]{"gcd(a, b)", Lists.newArrayList("a", "b"), row,
3L});
+ inputs.add(new Object[]{"lcm(a, b)", Lists.newArrayList("a", "b"), row,
18L});
+ }
+ {
+ GenericRow row = new GenericRow();
+ row.putValue("a", 9L);
+ row.putValue("b", 0L);
+ inputs.add(new Object[]{"gcd(a, b)", Lists.newArrayList("a", "b"), row,
9L});
+ inputs.add(new Object[]{"lcm(a, b)", Lists.newArrayList("a", "b"), row,
0L});
+ }
+ {
+ GenericRow row = new GenericRow();
+ row.putValue("a", 0L);
+ row.putValue("b", 9L);
+ inputs.add(new Object[]{"gcd(a, b)", Lists.newArrayList("a", "b"), row,
9L});
+ inputs.add(new Object[]{"lcm(a, b)", Lists.newArrayList("a", "b"), row,
0L});
+ }
+ {
+ GenericRow row = new GenericRow();
+ row.putValue("a", 0L);
+ row.putValue("b", 0L);
+ inputs.add(new Object[]{"gcd(a, b)", Lists.newArrayList("a", "b"), row,
0L});
+ inputs.add(new Object[]{"lcm(a, b)", Lists.newArrayList("a", "b"), row,
0L});
+ }
+ // test hypot
+ {
+ GenericRow row = new GenericRow();
+ row.putValue("a", 3.0);
+ row.putValue("b", 4.0);
+ inputs.add(new Object[]{"hypot(a, b)", Lists.newArrayList("a", "b"),
row, 5.0});
+ }
+ // test byteswapInt
+ {
+ GenericRow row = new GenericRow();
+ row.putValue("a", 0x12345678);
+ inputs.add(new Object[]{"byteswapInt(a)", Lists.newArrayList("a"), row,
0x78563412});
+ }
+ // test byteswapLong
+ {
+ GenericRow row = new GenericRow();
+ row.putValue("a", 0x1234567890abcdefL);
+ inputs.add(new Object[]{"byteswapLong(a)", Lists.newArrayList("a"), row,
0xefcdab9078563412L});
+ }
return inputs.toArray(new Object[0][]);
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]