Class "JdkMath" bridges user code and alternative implementations.

It's a "drop-in" replacement for JDK's "Math" as of Java 8 (cf. MATH-1630).

"AccurateMath" contains pure Java, acccurate, implementations of "Math" functions.
But it is no longer required to implement all of them.
diff --git a/commons-math-core/src/main/java/org/apache/commons/math4/core/jdkmath/AccurateMath.java b/commons-math-core/src/main/java/org/apache/commons/math4/core/jdkmath/AccurateMath.java
index 8687030..b4af270 100644
--- a/commons-math-core/src/main/java/org/apache/commons/math4/core/jdkmath/AccurateMath.java
+++ b/commons-math-core/src/main/java/org/apache/commons/math4/core/jdkmath/AccurateMath.java
@@ -29,10 +29,6 @@
  * to the various JVM optimizations that have appeared since Java 5).
  * However, any change to this class should ensure that the current
  * accuracy is not lost.
- * <p>
- * AccurateMath is a drop-in replacement for both Math and StrictMath.
- * For example, a call to {@code Math.sin(x)} can be replaced by a call
- * to {@code AccurateMath.sin(x)}.
  * </p>
  * <p>
  * AccurateMath speed is achieved by relying heavily on optimizing compilers
diff --git a/commons-math-core/src/main/java/org/apache/commons/math4/core/jdkmath/JdkMath.java b/commons-math-core/src/main/java/org/apache/commons/math4/core/jdkmath/JdkMath.java
index 37295c8..6525ed7 100644
--- a/commons-math-core/src/main/java/org/apache/commons/math4/core/jdkmath/JdkMath.java
+++ b/commons-math-core/src/main/java/org/apache/commons/math4/core/jdkmath/JdkMath.java
@@ -29,7 +29,17 @@
 
 /**
  * Wrapper for alternative implementations of {@link Math} functions.
+ * For example, a call to {@code Math.sin(x)} can be replaced by a call
+ * to {@code JdkMath.sin(x)}.
  *
+ * <p>
+ * This class is a "drop-in" replacement for both Math and StrictMath,
+ * up to the <em>minimal</em> JDK version required by this library
+ * (meaning that, although the library can be used on <em>more</em>
+ * recent JVMs, the {@code JdkMath} class may be missing the methods
+ * that were absent in older JDKs).
+ *
+ * <p>
  * Based on the value, at class initialization, of the system property
  * {@code org.apache.commons.math.jdkmath}, this class redirects to a
  * specific implementation:
diff --git a/commons-math-core/src/test/java/org/apache/commons/math4/core/jdkmath/JdkMathTest.java b/commons-math-core/src/test/java/org/apache/commons/math4/core/jdkmath/JdkMathTest.java
new file mode 100644
index 0000000..659d32f
--- /dev/null
+++ b/commons-math-core/src/test/java/org/apache/commons/math4/core/jdkmath/JdkMathTest.java
@@ -0,0 +1,70 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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 org.apache.commons.math4.core.jdkmath;
+
+import java.util.List;
+import java.util.ArrayList;
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+import java.lang.reflect.Type;
+
+import org.junit.Test;
+import org.junit.Assert;
+
+/**
+ * Tests for {@link JdkMath}.
+ */
+public class JdkMathTest {
+    /** Separator. */
+    private static final String LINE_SEP = System.lineSeparator();
+
+    @Test
+    public void checkMissingMethods() {
+        final List<String> notFound = compareClassMethods(StrictMath.class,
+                                                          JdkMath.class);
+        if (!notFound.isEmpty()) {
+            final StringBuilder sb = new StringBuilder();
+            sb.append("JdkMath is missing the following StrictMath methods:");
+            for (String m : notFound) {
+                sb.append(LINE_SEP).append(m);
+            }
+            Assert.fail(sb.toString());
+        }
+    }
+
+    /**
+     * @param class1 Reference implementation.
+     * @param class2 Alternate implementation.
+     * @return the methods defined in {@code class1} that are not in {@code class2}.
+     */
+    private List<String> compareClassMethods(Class<?> class1,
+                                             Class<?> class2) {
+        final List<String> notFound = new ArrayList<>();
+        for (Method method1 : class1.getDeclaredMethods()) {
+            if (Modifier.isPublic(method1.getModifiers())) {
+                final Type[] params = method1.getGenericParameterTypes();
+                try {
+                    class2.getDeclaredMethod(method1.getName(), (Class[]) params);
+                } catch (NoSuchMethodException e) {
+                    notFound.add(method1.toString());
+                }
+            }
+        }
+
+        return notFound;
+    }
+}
diff --git a/commons-math-legacy-core/src/test/java/org/apache/commons/math4/legacy/core/jdkmath/AccurateMathTest.java b/commons-math-legacy-core/src/test/java/org/apache/commons/math4/legacy/core/jdkmath/AccurateMathTest.java
index fbfe40c..1c7b8c3 100644
--- a/commons-math-legacy-core/src/test/java/org/apache/commons/math4/legacy/core/jdkmath/AccurateMathTest.java
+++ b/commons-math-legacy-core/src/test/java/org/apache/commons/math4/legacy/core/jdkmath/AccurateMathTest.java
@@ -20,16 +20,12 @@
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
-import java.lang.reflect.Method;
-import java.lang.reflect.Modifier;
-import java.lang.reflect.Type;
 import java.math.BigDecimal;
 import java.math.BigInteger;
 import java.math.RoundingMode;
 
 import org.junit.Assert;
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.jupiter.api.Assertions;
 import org.apache.commons.numbers.core.ArithmeticUtils;
@@ -1296,34 +1292,6 @@
         assertEquals(Float.NEGATIVE_INFINITY, AccurateMath.scalb(-3.4028235E38f, 2147483647), 0F);
     }
 
-    private boolean compareClassMethods(Class<?> class1, Class<?> class2) {
-        boolean allfound = true;
-        for (Method method1 : class1.getDeclaredMethods()) {
-            if (Modifier.isPublic(method1.getModifiers())) {
-                Type[] params = method1.getGenericParameterTypes();
-                try {
-                    class2.getDeclaredMethod(method1.getName(), (Class[]) params);
-                } catch (NoSuchMethodException e) {
-                    allfound = false;
-                    System.out.println(class2.getSimpleName() + " does not implement: " + method1);
-                }
-            }
-        }
-        return allfound;
-    }
-
-    @Test
-    public void checkMissingAccurateMathClasses() {
-        boolean ok = compareClassMethods(StrictMath.class, AccurateMath.class);
-        assertTrue("AccurateMath should implement all StrictMath methods", ok);
-    }
-
-    @Ignore
-    @Test
-    public void checkExtraAccurateMathClasses() {
-        compareClassMethods(AccurateMath.class, StrictMath.class);
-    }
-
     @Test
     public void testSignumDouble() {
         final double delta = 0.0;