QDouble.st
changeset 4421 2603ea13cb5c
parent 4420 2ec5ce5062eb
child 4427 15d052db3e6e
--- a/QDouble.st	Mon Jun 19 17:56:16 2017 +0200
+++ b/QDouble.st	Mon Jun 19 18:12:11 2017 +0200
@@ -22,7 +22,6 @@
 !
 
 !QDouble primitiveDefinitions!
-
 %{
 #include <stdio.h>
 #include <errno.h>
@@ -610,7 +609,6 @@
 
 !QDouble class methodsFor:'documentation'!
 
-
 copyright
 "
  COPYRIGHT (c) 2017 by eXept Software AG
@@ -1203,6 +1201,15 @@
     "Modified: / 13-06-2017 / 17:56:50 / cg"
 !
 
+asInteger
+    ^ self d0 asInteger
+    + self d1 asInteger 
+    + self d2 asInteger 
+    + self d3 asInteger
+
+    "Created: / 19-06-2017 / 18:07:17 / cg"
+!
+
 asQDouble
     "return a QDouble with same value as myself."
 
@@ -1374,50 +1381,69 @@
 productFromFloat:aFloat
 %{
     if (__isFloatLike(aFloat)) {
-	double *a = __QuadDoubleInstPtr(self)->d_quadDoubleValue;
-	double b = __floatVal(aFloat);
-	double p0, p1, p2, p3;
-	double q0, q1, q2;
-	double s0, s1, s2, s3, s4;
-	OBJ newQD;
-	int savedCV;
-
-	fpu_fix_start(&savedCV);
-
-	m_two_prod(p0, a[0], b, q0);
-	m_two_prod(p1, a[1], b, q1);
-	m_two_prod(p2, a[2], b, q2);
-	p3 = a[3] * b;
-
-	s0 = p0;
-
-	m_two_sum(s1, q0, p1, s2);
-
-	m_three_sum(s2, q1, p2);
-
-	m_three_sum2(q1, q2, p3);
-	s3 = q1;
-
-	s4 = q2 + p2;
-
-	m_renorm5(s0, s1, s2, s3, s4);
-	fpu_fix_end(&savedCV);
-
-	__qNew_qdReal(newQD, s0, s1, s2, s3);
-	RETURN( newQD );
+        double *a = __QuadDoubleInstPtr(self)->d_quadDoubleValue;
+        double b = __floatVal(aFloat);
+        double p0, p1, p2, p3;
+        double q0, q1, q2;
+        double s0, s1, s2, s3, s4;
+        OBJ newQD;
+        int savedCV;
+
+        fpu_fix_start(&savedCV);
+
+        m_two_prod(p0, a[0], b, q0);
+        m_two_prod(p1, a[1], b, q1);
+        m_two_prod(p2, a[2], b, q2);
+        p3 = a[3] * b;
+
+        s0 = p0;
+
+        m_two_sum(s1, q0, p1, s2);
+
+        m_three_sum(s2, q1, p2);
+
+        m_three_sum2(q1, q2, p3);
+        s3 = q1;
+
+        s4 = q2 + p2;
+
+        m_renorm5(s0, s1, s2, s3, s4);
+        fpu_fix_end(&savedCV);
+
+        __qNew_qdReal(newQD, s0, s1, s2, s3);
+        RETURN( newQD );
     }
 %}.
     ^ super productFromFloat:aFloat.
 
     "
-     (QDouble fromFloat:1.0) productFromFloat:2.0
-     ((QDouble fromFloat:1e20) + (QDouble fromFloat:1.0)) productFromFloat:2.0
-     ((QDouble fromFloat:1e20) + (QDouble fromFloat:1.0)) productFromFloat:2e20
+     loosing bits here:
+     
+     (1e20+1.0)*2.0
+     (1e20+1.0)*1e20
+     (1e40+1.0)*2.0
+
+     but not here:
+
+     (1.0 asQDouble) * 2.0
+     ((1e20 asQDouble) + (1.0)) * 2.0   
+     ((1e20 asQDouble) + (1.0)) * 100.0    10000000000000000000100.0
+     ((1e20 asQDouble) + (1.0)) * 1000.0   
+     ((1e40 asQDouble) + (1.0)) * 2.0    
 
      2.0 * (QDouble fromFloat:1.0)
      2.0 * (QDouble fromFloat:3.0)
-
-     2.0 * ((QDouble fromFloat:1e20) + (QDouble fromFloat:1.0))
+     (QDouble fromFloat:2.0) * (QDouble fromFloat:3.0)
+     
+     QDouble ln2       DoubleArray(0.693147180559945 2.3190468138463E-17 5.70770843841621E-34 -3.58243221060181E-50)
+     2.0 * QDouble ln2 DoubleArray(1.38629436111989 4.6380936276926E-17 1.14154168768324E-33 -7.16486442120362E-50)
+     QDouble ln2 * 2.0 
+     
+     2.0 * ((QDouble fromFloat:1e20) + (QDouble fromFloat:1.0)) DoubleArray(2E+20 2.0 0.0 0.0)
+     ((QDouble fromFloat:1e20) + (QDouble fromFloat:1.0)) * 2.0 DoubleArray(2E+20 4E+20 0.0 0.0)
+     ((QDouble fromFloat:1e20) + (QDouble fromFloat:1.0)) * (QDouble fromFloat:2.0) DoubleArray(2E+20 4E+20 0.0 0.0)
+     (QDouble fromFloat:2.0) * ((QDouble fromFloat:1e20) + (QDouble fromFloat:1.0)) DoubleArray(2E+20 4E+20 0.0 0.0)
+     
      (2.0 * ((QDouble fromFloat:1e20) + (QDouble fromFloat:1.0))) - (QDouble fromFloat:1e20) - (QDouble fromFloat:1e20)
 
      (2.0 * (QDouble fromFloat:1.0)) asFloat
@@ -1427,7 +1453,8 @@
     "
 
     "Created: / 13-06-2017 / 00:58:56 / cg"
-    "Modified: / 14-06-2017 / 11:42:57 / cg"
+    "Modified: / 19-06-2017 / 16:48:18 / cg"
+    "Modified (comment): / 19-06-2017 / 18:11:43 / cg"
 !
 
 productFromQDouble:aQDouble
@@ -2617,3 +2644,4 @@
 version_CVS
     ^ '$Header$'
 ! !
+