--- 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$'
! !
+