Make sure that float follows the same semantics as double

...in equals and relevant utilities in java.util.Arrays.

Change-Id: I8980f29289d2a7723d1f939aa594bee1236e18a7
diff --git a/user/super/com/google/gwt/emul/java/lang/Float.java b/user/super/com/google/gwt/emul/java/lang/Float.java
index 565e2df..64340d4 100644
--- a/user/super/com/google/gwt/emul/java/lang/Float.java
+++ b/user/super/com/google/gwt/emul/java/lang/Float.java
@@ -207,7 +207,8 @@
 
   @Override
   public boolean equals(Object o) {
-    return (o instanceof Float) && (((Float) o).value == value);
+    // Make sure Float follow the same semantic as Double for consistency.
+    return (o instanceof Float) && Double.valueOf(value).equals(Double.valueOf(((Float) o).value));
   }
 
   @Override
diff --git a/user/super/com/google/gwt/emul/java/util/Arrays.java b/user/super/com/google/gwt/emul/java/util/Arrays.java
index 53a927f..06c1ded 100644
--- a/user/super/com/google/gwt/emul/java/util/Arrays.java
+++ b/user/super/com/google/gwt/emul/java/util/Arrays.java
@@ -39,11 +39,9 @@
 import java.util.stream.LongStream;
 import java.util.stream.Stream;
 import java.util.stream.StreamSupport;
-
 import javaemul.internal.ArrayHelper;
 import javaemul.internal.JsUtils;
 import javaemul.internal.NativeArray.CompareFunction;
-
 import jsinterop.annotations.JsFunction;
 
 /**
@@ -287,34 +285,11 @@
    *         the array) minus 1 (to ensure error returns are negative)
    */
   public static int binarySearch(float[] sortedArray, int fromIndex, int toIndex, float key) {
-    checkCriticalArrayBounds(fromIndex, toIndex, sortedArray.length);
-    return binarySearch0(sortedArray, fromIndex, toIndex, key);
+    return binarySearch(JsUtils.<double[]>uncheckedCast(sortedArray), fromIndex, toIndex, key);
   }
 
   public static int binarySearch(float[] sortedArray, float key) {
-    return binarySearch0(sortedArray, 0, sortedArray.length, key);
-  }
-
-  private static int binarySearch0(final float[] sortedArray, int fromIndex, int toIndex,
-      final float key) {
-    int low = fromIndex;
-    int high = toIndex - 1;
-
-    while (low <= high) {
-      final int mid = low + ((high - low) >> 1);
-      final float midVal = sortedArray[mid];
-
-      if (midVal < key) {
-        low = mid + 1;
-      } else if (midVal > key) {
-        high = mid - 1;
-      } else {
-        // key found
-        return mid;
-      }
-    }
-    // key not found.
-    return -low - 1;
+    return binarySearch(JsUtils.<double[]>uncheckedCast(sortedArray), key);
   }
 
   /**
@@ -780,7 +755,8 @@
     }
 
     for (int i = 0; i < array1.length; ++i) {
-      if (array1[i] != array2[i]) {
+      // Make sure we follow Double equality semantics (per spec of the method).
+      if (!((Double) array1[i]).equals(array2[i])) {
         return false;
       }
     }
@@ -789,25 +765,7 @@
   }
 
   public static boolean equals(float[] array1, float[] array2) {
-    if (array1 == array2) {
-      return true;
-    }
-
-    if (array1 == null || array2 == null) {
-      return false;
-    }
-
-    if (array1.length != array2.length) {
-      return false;
-    }
-
-    for (int i = 0; i < array1.length; ++i) {
-      if (array1[i] != array2[i]) {
-        return false;
-      }
-    }
-
-    return true;
+    return equals(JsUtils.<double[]>uncheckedCast(array1), JsUtils.<double[]>uncheckedCast(array2));
   }
 
   public static boolean equals(int[] array1, int[] array2) {