Add StrictMath emulation

PiperOrigin-RevId: 323720845
Change-Id: I58279b243a5bef9eadc8e43f41d24f9c86793f16
diff --git a/user/super/com/google/gwt/emul/java/lang/StrictMath.java b/user/super/com/google/gwt/emul/java/lang/StrictMath.java
new file mode 100644
index 0000000..d40b464
--- /dev/null
+++ b/user/super/com/google/gwt/emul/java/lang/StrictMath.java
@@ -0,0 +1,239 @@
+/*
+ * Copyright 2020 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package java.lang;
+
+/** StrictMath utility methods and constants. */
+public final class StrictMath {
+
+  public static final double E = Math.E;
+  public static final double PI = Math.PI;
+
+  public static double abs(double x) {
+    return Math.abs(x);
+  }
+
+  public static float abs(float x) {
+    return Math.abs(x);
+  }
+
+  public static int abs(int x) {
+    return Math.abs(x);
+  }
+
+  public static double acos(double x) {
+    return Math.acos(x);
+  }
+
+  public static int addExact(int x, int y) {
+    return Math.addExact(x, y);
+  }
+
+  public static long addExact(long x, long y) {
+    return Math.addExact(x, y);
+  }
+
+  public static double asin(double x) {
+    return Math.asin(x);
+  }
+
+  public static double atan(double x) {
+    return Math.atan(x);
+  }
+
+  public static double atan2(double y, double x) {
+    return Math.atan(x);
+  }
+
+  public static double ceil(double x) {
+    return Math.ceil(x);
+  }
+
+  public static double copySign(double magnitude, double sign) {
+    return Math.copySign(magnitude, sign);
+  }
+
+  public static float copySign(float magnitude, float sign) {
+    return Math.copySign(magnitude, sign);
+  }
+
+  public static double cos(double x) {
+    return Math.cos(x);
+  }
+
+  public static double cosh(double x) {
+    return Math.cosh(x);
+  }
+
+  public static double exp(double x) {
+    return Math.exp(x);
+  }
+
+  public static double expm1(double x) {
+    return Math.expm1(x);
+  }
+
+  public static double floor(double x) {
+    return Math.floor(x);
+  }
+
+  public static int floorDiv(int dividend, int divisor) {
+    return Math.floorDiv(dividend, divisor);
+  }
+
+  public static long floorDiv(long dividend, long divisor) {
+    return Math.floorDiv(dividend, divisor);
+  }
+
+  public static int floorMod(int dividend, int divisor) {
+    return Math.floorMod(dividend, divisor);
+  }
+
+  public static long floorMod(long dividend, long divisor) {
+    return Math.floorMod(dividend, divisor);
+  }
+
+  public static double hypot(double x, double y) {
+    return Math.hypot(x, y);
+  }
+
+  public static double log(double x) {
+    return Math.log(x);
+  }
+
+  public static double log10(double x) {
+    return Math.log10(x);
+  }
+
+  public static double log1p(double x) {
+    return Math.log1p(x);
+  }
+
+  public static double max(double x, double y) {
+    return Math.max(x, y);
+  }
+
+  public static float max(float x, float y) {
+    return Math.max(x, y);
+  }
+
+  public static int max(int x, int y) {
+    return Math.max(x, y);
+  }
+
+  public static long max(long x, long y) {
+    return Math.max(x, y);
+  }
+
+  public static double min(double x, double y) {
+    return Math.min(x, y);
+  }
+
+  public static float min(float x, float y) {
+    return Math.min(x, y);
+  }
+
+  public static int min(int x, int y) {
+    return Math.min(x, y);
+  }
+
+  public static long min(long x, long y) {
+    return Math.min(x, y);
+  }
+
+  public static int multiplyExact(int x, int y) {
+    return Math.multiplyExact(x, y);
+  }
+
+  public static long multiplyExact(long x, long y) {
+    return Math.multiplyExact(x, y);
+  }
+
+  public static double pow(double x, double exp) {
+    return Math.pow(x, exp);
+  }
+
+  public static double random() {
+    return Math.random();
+  }
+
+  public static double rint(double x) {
+    return Math.rint(x);
+  }
+
+  public static long round(double x) {
+    return Math.round(x);
+  }
+
+  public static int round(float x) {
+    return Math.round(x);
+  }
+
+  public static double scalb(double d, int scaleFactor) {
+    return Math.scalb(d, scaleFactor);
+  }
+
+  public static float scalb(float f, int scaleFactor) {
+    return Math.scalb(f, scaleFactor);
+  }
+
+  public static double signum(double d) {
+    return Math.signum(d);
+  }
+
+  public static float signum(float f) {
+    return Math.signum(f);
+  }
+
+  public static double sin(double x) {
+    return Math.sin(x);
+  }
+
+  public static double sinh(double x) {
+    return Math.sinh(x);
+  }
+
+  public static double sqrt(double x) {
+    return Math.sqrt(x);
+  }
+
+  public static int subtractExact(int x, int y) {
+    return Math.subtractExact(x, y);
+  }
+
+  public static long subtractExact(long x, long y) {
+    return Math.subtractExact(x, y);
+  }
+
+  public static double tan(double x) {
+    return Math.tan(x);
+  }
+
+  public static double tanh(double x) {
+    return Math.tanh(x);
+  }
+
+  public static double toDegrees(double x) {
+    return Math.toDegrees(x);
+  }
+
+  public static int toIntExact(long x) {
+    return Math.toIntExact(x);
+  }
+
+  public static double toRadians(double x) {
+    return Math.toRadians(x);
+  }
+}