harmony-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Egor Pasko <egor.pa...@gmail.com>
Subject Re: Float/Double comparison performance
Date Fri, 01 May 2009 11:33:45 GMT
On the 0x5A4 day of Apache Harmony Tim Ellison wrote:
>      /**
> @@ -402,25 +384,31 @@
>       * @since 1.4
>       */
>      public static int compare(float float1, float float2) {
> -        int f1, f2;
> -        int NaNbits = Float.floatToIntBits(Float.NaN);
> -        if ((f1 = Float.floatToIntBits(float1)) == NaNbits) {
> -            if (Float.floatToIntBits(float2) == NaNbits) {
> -                return 0;
> -            }
> +
> +        if (float1 > float2) {
>              return 1;
>          }
> -        if ((f2 = Float.floatToIntBits(float2)) == NaNbits) {
> +        if (float2 > float1) {
>              return -1;
>          }
> -        if (float1 == float2) {
> -            if (f1 == f2) {
> +
> +        int f1 = floatToRawIntBits(float1);
> +        int f2 = floatToRawIntBits(float2);
> +        if (f1 == f2) {
> +            return 0;
> +        }

I'd suggest a slightly different code path: move native calls further
below. floatToRawIntBits() is *very* slow and only useful for -0f
checking. Hitting two zeroes is less likely than hitting a NaN IMHO.

Should look like this:

// Non-zero and non-NaN equality checking.
if (float1 == float2 && (0.0f != float1 || 0.0f != float2)) {
  return 0;
}

// NaNs are equal to other NaNs and larger than any other float.
[...]

// Sort out zeroes.
int f1 = floatToRawIntBits(float1);
int f2 = floatToRawIntBits(float2);
[...]

> +
> +        // NaNs are equal to other NaNs and larger than any other float
> +        if (isNaN(float1)) {
> +            if (isNaN(float2)) {
>                  return 0;
>              }
> -            // check for -0
> -            return f1 > f2 ? 1 : -1;
> +            return 1;
> +        } else if (isNaN(float2)) {
> +            return -1;
>          }
> -        return float1 > float2 ? 1 : -1;
> +
> +        return (f1 < f2) ? -1 : 1;
>      }
>
>      /**
>

-- 
Egor Pasko


Mime
View raw message