stdcxx-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From se...@apache.org
Subject svn commit: r290783 - /incubator/stdcxx/trunk/tests/src/valcmp.cpp
Date Wed, 21 Sep 2005 18:45:16 GMT
Author: sebor
Date: Wed Sep 21 11:45:12 2005
New Revision: 290783

URL: http://svn.apache.org/viewcvs?rev=290783&view=rev
Log:
2005-09-21  Martin Sebor  <sebor@roguewave.com>

	* valcmp.cpp (rw_ldblcmp): Implemented in terms of absolute
	and relative errors instead of naively using memcmp().


Modified:
    incubator/stdcxx/trunk/tests/src/valcmp.cpp

Modified: incubator/stdcxx/trunk/tests/src/valcmp.cpp
URL: http://svn.apache.org/viewcvs/incubator/stdcxx/trunk/tests/src/valcmp.cpp?rev=290783&r1=290782&r2=290783&view=diff
==============================================================================
--- incubator/stdcxx/trunk/tests/src/valcmp.cpp (original)
+++ incubator/stdcxx/trunk/tests/src/valcmp.cpp Wed Sep 21 11:45:12 2005
@@ -777,6 +777,8 @@
 
 #ifndef _RWSTD_NO_LONG_DOUBLE
 
+#  define Abs(x) ((x) < 0 ? -(x) : (x))
+
 _TEST_EXPORT int
 rw_ldblcmp (long double x, long double y)
 {
@@ -787,7 +789,21 @@
         return 0;
 
     // FIXME: use integer math as in the functions above
-    return memcmp (&x, &y, sizeof x);
+
+    const long double diff = x - y;
+
+    // check absolute error
+    if (Abs (diff) < _RWSTD_LDBL_EPSILON)
+        return 0;
+
+    // check relative error
+    const long double relerr =
+        Abs (x) < Abs (y) ? Abs (diff / y) : Abs (diff / x);
+
+    if (relerr <= 0.0000001L)
+        return 0;
+
+    return x < y ? -1 : +1;
 }
 
 #endif   // _RWSTD_NO_LONG_DOUBLE



Mime
View raw message