Math.min(float,float) seems to have incorrect behaviour for negative zero.

  public static float min(float a, float b) {
    if (a == 0.0f && b == 0.0f) // return -0.0f, if a or b is -0.0f
      return ((Float.floatToIntBits(a) >> 31) == 1) ? a : b;
    return (a < b) ? a : b;
  }

note that the condition (Float.floatToIntBits(a) >> 31) == 1 is never true
since int >> 31 can only be 0 or -1. So
    Math.min( -0.0f, 0.0f )
incorrectly returns 0.0f instead of -0.0f.

A releated problem affects min(double,double) and max.

Solution:
  public static float min(float a, float b) {
    if (a == 0.0f && b == 0.0f) // return -0.0f, if a or b is -0.0f
      return (Float.floatToIntBits(a) < 0) ? a : b;
    return (a < b) ? a : b;
  }

This also avoids multibit shifts which are slow on some processors (e.g.
Palm).

PS I don't understand how to report a bug via Savannah.
--
Peter.Dickerson (at) ukonline (dot) co (dot) uk




_______________________________________________
Classpath mailing list
[EMAIL PROTECTED]
http://mail.gnu.org/mailman/listinfo/classpath

Reply via email to