This is the mail archive of the
java-patches@gcc.gnu.org
mailing list for the Java project.
More Double/Float merging
- To: java-patches at gcc dot gnu dot org
- Subject: More Double/Float merging
- From: Mark Wielaard <mark at klomp dot org>
- Date: Sat, 20 Oct 2001 03:19:14 +0200
Hi,
Here are the suggestions from the Classpath list for the remaining
Double/Float merge. This shows no new regressions with the Double/Float
tests in Mauve.
With this patch Float is completely merged with Classpath, Double still
has a different (native) parseDouble() method. This needs working on the
Classpath side.
2001-10-19 Mark Wielaard <mark@klomp.org>
* java/lang/Double.java: More Classpath merging
(isInfinite): Don't use doubleToLongBits
(isNaN (Object)): return v != v
(initIDs): make native
* java/lang/Float.java: Ditto
(isInfinite): Don't use floatToIntBits
(isNaN (Object)): return v != v
* java/lang/natDouble.cc: add empty initIDs()
OK to commit?
Cheers,
Mark
--
Stuff to read:
<http://www.toad.com/gnu/whatswrong.html>
What's Wrong with Copy Protection, by John Gilmore
Index: java/lang/Double.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/java/lang/Double.java,v
retrieving revision 1.10
diff -u -r1.10 Double.java
--- Double.java 2001/10/15 06:31:13 1.10
+++ Double.java 2001/10/20 01:09:27
@@ -146,6 +146,14 @@
* <code>instanceof</code> <code>Double</code>, and represents
* the same primitive <code>double</code> value return
* <code>true</code>. Otherwise <code>false</code> is returned.
+ * <p>
+ * Note that there are two differences between <code>==</code> and
+ * <code>equals()</code>. <code>0.0d == -0.0d</code> returns <code>true</code>
+ * but <code>new Double(0.0d).equals(new Double(-0.0d))</code> returns
+ * <code>false</code>. And <code>Double.NaN == Double.NaN</code> returns
+ * <code>false</code>, but
+ * <code>new Double(Double.NaN).equals(new Double(Double.NaN))</code> returns
+ * <code>true</code>.
*
* @param obj the object to compare to
* @return whether the objects are semantically equal.
@@ -248,11 +256,9 @@
*/
public static boolean isNaN (double v)
{
- long bits = doubleToLongBits (v);
- long e = bits & 0x7ff0000000000000L;
- long f = bits & 0x000fffffffffffffL;
-
- return e == 0x7ff0000000000000L && f != 0L;
+ // This works since NaN != NaN is the only reflexive inequality
+ // comparison which returns true.
+ return v != v;
}
/**
@@ -277,10 +283,7 @@
*/
public static boolean isInfinite (double v)
{
- long bits = doubleToLongBits (v);
- long f = bits & 0x7fffffffffffffffL;
-
- return f == 0x7ff0000000000000L;
+ return (v == POSITIVE_INFINITY || v == NEGATIVE_INFINITY);
}
/**
@@ -508,5 +511,5 @@
* Initialize JNI cache. This method is called only by the
* static initializer when using JNI.
*/
- private static void initIDs () { /* Not used in libgcj */ };
+ private static native void initIDs ();
}
Index: java/lang/Float.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/java/lang/Float.java,v
retrieving revision 1.9
diff -u -r1.9 Float.java
--- Float.java 2001/10/15 06:31:13 1.9
+++ Float.java 2001/10/20 01:09:27
@@ -215,6 +215,14 @@
* <code>instanceof</code> <code>Float</code>, and represents
* the same primitive <code>float</code> value return
* <code>true</code>. Otherwise <code>false</code> is returned.
+ * <p>
+ * Note that there are two differences between <code>==</code> and
+ * <code>equals()</code>. <code>0.0f == -0.0f</code> returns <code>true</code>
+ * but <code>new Float(0.0f).equals(new Float(-0.0f))</code> returns
+ * <code>false</code>. And <code>Float.NaN == Float.NaN</code> returns
+ * <code>false</code>, but
+ * <code>new Float(Float.NaN).equals(new Float(Float.NaN))</code> returns
+ * <code>true</code>.
*
* @param obj the object to compare to
* @return whether the objects are semantically equal.
@@ -364,11 +372,9 @@
*/
public static boolean isNaN (float v)
{
- int bits = floatToIntBits (v);
- int e = bits & 0x7f800000;
- int f = bits & 0x007fffff;
-
- return e == 0x7f800000 && f != 0;
+ // This works since NaN != NaN is the only reflexive inequality
+ // comparison which returns true.
+ return v != v;
}
/**
@@ -393,10 +399,7 @@
*/
public static boolean isInfinite (float v)
{
- int bits = floatToIntBits (v);
- int f = bits & 0x7fffffff;
-
- return f == 0x7f800000;
+ return (v == POSITIVE_INFINITY || v == NEGATIVE_INFINITY);
}
/**
Index: java/lang/natDouble.cc
===================================================================
RCS file: /cvs/gcc/gcc/libjava/java/lang/natDouble.cc,v
retrieving revision 1.14
diff -u -r1.14 natDouble.cc
--- natDouble.cc 2001/03/26 07:05:32 1.14
+++ natDouble.cc 2001/10/20 01:09:27
@@ -186,3 +186,9 @@
}
throw new NumberFormatException;
}
+
+void
+java::lang::Double::initIDs()
+{
+ // Not used in libgcj
+}