diff -r 2ec5ce5062eb -r 2603ea13cb5c QDouble.st --- 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 #include @@ -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$' ! ! +