41 {
42 mfunnamep(
"DoubleAc& DoubleAc::operator*=(const DoubleAc& f)");
43#ifdef DEBUG_OPERATOR_MULT_PRINT
45 mcout <<
"d=" << d <<
'\n';
46 mcout <<
"di=" << di <<
'\n';
47 mcout <<
"da=" << da <<
'\n';
48 mcout <<
"f.d=" << f.d <<
'\n';
49 mcout <<
"f.di=" << f.di <<
'\n';
50 mcout <<
"f.da=" << f.da <<
'\n';
51#endif
52#ifndef VISUAL_STUDIO
53 if (std::isnan(di) == 1) di = -DBL_MAX;
54 if (std::isnan(da) == 1) da = DBL_MAX;
55 if (std::isnan(f.di) == 1) f.di = -DBL_MAX;
56 if (std::isnan(f.da) == 1) f.da = DBL_MAX;
57#else
58 if (_isnan(di) == 1) di = -DBL_MAX;
59 if (_isnan(da) == 1) da = DBL_MAX;
60 if (_isnan(f.di) == 1) f.di = -DBL_MAX;
61 if (_isnan(f.da) == 1) f.da = DBL_MAX;
62#endif
63#ifdef POSSIBLE_FAILURE_ISNAN
64 if (!(di < d) && !(di >= d)) di = -DBL_MAX;
65 if (!(da < d) && !(da >= d)) da = DBL_MAX;
66 if (!(f.di < f.d) && !(f.di >= f.d)) f.di = -DBL_MAX;
67 if (!(f.da < f.d) && !(f.da >= f.d)) f.da = DBL_MAX;
68#endif
69#ifdef DEBUG_OPERATOR_MULT
71#endif
72 d *= f.d;
73 if (di >= 0) {
74 if (f.di >= 0) {
75 di *= f.di;
76 da *= f.da;
77#ifdef DEBUG_OPERATOR_MULT_PRINT
79#endif
80 } else if (f.da >= 0)
81 {
82 di = f.di * da;
83 da *= f.da;
84#ifdef DEBUG_OPERATOR_MULT_PRINT
86#endif
87 } else
88 {
89 double ti = da * f.di;
90 da = di * f.da;
91 di = ti;
92#ifdef DEBUG_OPERATOR_MULT_PRINT
94#endif
95 }
96 } else if (da >= 0)
97 {
98 if (f.di >= 0) {
99 di *= f.da;
100 da *= f.da;
101#ifdef DEBUG_OPERATOR_MULT_PRINT
103#endif
104 } else if (f.da >= 0) {
105 double ti = std::min(di * f.da, da * f.di);
106 da = std::max(di * f.di, da * f.da);
107 di = ti;
108#ifdef DEBUG_OPERATOR_MULT_PRINT
110#endif
111 } else {
112 double ti = da * f.di;
113 da = di * f.di;
114 di = ti;
115#ifdef DEBUG_OPERATOR_MULT_PRINT
117#endif
118 }
119 } else
120 {
121 if (f.di >= 0) {
122 di *= f.da;
123 da *= f.di;
124#ifdef DEBUG_OPERATOR_MULT_PRINT
126#endif
127 } else if (f.da >= 0) {
128 double ti = di * f.da;
129 da = di * f.di;
130 di = ti;
131#ifdef DEBUG_OPERATOR_MULT_PRINT
133#endif
134 } else {
135 double ti = da * f.da;
136 da = di * f.di;
137 di = ti;
138#ifdef DEBUG_OPERATOR_MULT_PRINT
140#endif
141 }
142 }
143
144
145
146#ifdef CHECK_CORRECTNESS_AT_MULT
147 if (d < di) {
148 if (d - di == 0.0)
149 goto mend;
151 mcerr <<
"d < di at the end of computations\n";
152 mcerr <<
"This number:\n";
154 mcerr <<
"Argument:\n";
156 if (d > di)
mcerr <<
"if(d > di) is also positive\n";
157 if (d == di)
mcerr <<
"if(d == di) is also positive\n";
159#ifdef DEBUG_OPERATOR_MULT
160
161 mcerr <<
"old value:\n";
162 temp.print(
mcerr, 6);
163#endif
165 }
166 if (d > da) {
167 if (d == da)
168 goto mend;
170 mcerr <<
"d > di at the end of computations\n";
171 mcerr <<
"This number:\n";
173 mcerr <<
"Argument:\n";
175 if (d < da)
mcerr <<
"if(d < da) is also positive\n";
176 if (d == da)
mcerr <<
"if(d == da) is also positive\n";
178#ifdef DEBUG_OPERATOR_MULT
179
180 mcerr <<
"old value:\n";
181 temp.print(
mcerr, 6);
182#endif
184 }
185mend:
186#endif
187 return *this;
188}
#define mfunnamep(string)
void print(std::ostream &file, int l=1) const
#define Iprintn(file, name)