40 {
41 mfunnamep(
"DoubleAc& DoubleAc::operator*=(const DoubleAc& f)");
42#ifdef DEBUG_OPERATOR_MULT_PRINT
44 mcout <<
"d=" << d <<
'\n';
45 mcout <<
"di=" << di <<
'\n';
46 mcout <<
"da=" << da <<
'\n';
47 mcout <<
"f.d=" << f.d <<
'\n';
48 mcout <<
"f.di=" << f.di <<
'\n';
49 mcout <<
"f.da=" << f.da <<
'\n';
50#endif
51#ifndef VISUAL_STUDIO
52 if (std::isnan(di) == 1) di = -DBL_MAX;
53 if (std::isnan(da) == 1) da = DBL_MAX;
54 if (std::isnan(f.di) == 1) f.di = -DBL_MAX;
55 if (std::isnan(f.da) == 1) f.da = DBL_MAX;
56#else
57 if (_isnan(di) == 1) di = -DBL_MAX;
58 if (_isnan(da) == 1) da = DBL_MAX;
59 if (_isnan(f.di) == 1) f.di = -DBL_MAX;
60 if (_isnan(f.da) == 1) f.da = DBL_MAX;
61#endif
62#ifdef POSSIBLE_FAILURE_ISNAN
63 if (!(di < d) && !(di >= d)) di = -DBL_MAX;
64 if (!(da < d) && !(da >= d)) da = DBL_MAX;
65 if (!(f.di < f.d) && !(f.di >= f.d)) f.di = -DBL_MAX;
66 if (!(f.da < f.d) && !(f.da >= f.d)) f.da = DBL_MAX;
67#endif
68#ifdef DEBUG_OPERATOR_MULT
70#endif
71 d *= f.d;
72 if (di >= 0) {
73 if (f.di >= 0) {
74 di *= f.di;
75 da *= f.da;
76#ifdef DEBUG_OPERATOR_MULT_PRINT
78#endif
79 } else if (f.da >= 0)
80 {
81 di = f.di * da;
82 da *= f.da;
83#ifdef DEBUG_OPERATOR_MULT_PRINT
85#endif
86 } else
87 {
88 double ti = da * f.di;
89 da = di * f.da;
90 di = ti;
91#ifdef DEBUG_OPERATOR_MULT_PRINT
93#endif
94 }
95 } else if (da >= 0)
96 {
97 if (f.di >= 0) {
98 di *= f.da;
99 da *= f.da;
100#ifdef DEBUG_OPERATOR_MULT_PRINT
102#endif
103 } else if (f.da >= 0) {
104 double ti =
find_min(di * f.da, da * f.di);
105 da =
find_max(di * f.di, da * f.da);
106 di = ti;
107#ifdef DEBUG_OPERATOR_MULT_PRINT
109#endif
110 } else {
111 double ti = da * f.di;
112 da = di * f.di;
113 di = ti;
114#ifdef DEBUG_OPERATOR_MULT_PRINT
116#endif
117 }
118 } else
119 {
120 if (f.di >= 0) {
121 di *= f.da;
122 da *= f.di;
123#ifdef DEBUG_OPERATOR_MULT_PRINT
125#endif
126 } else if (f.da >= 0) {
127 double ti = di * f.da;
128 da = di * f.di;
129 di = ti;
130#ifdef DEBUG_OPERATOR_MULT_PRINT
132#endif
133 } else {
134 double ti = da * f.da;
135 da = di * f.di;
136 di = ti;
137#ifdef DEBUG_OPERATOR_MULT_PRINT
139#endif
140 }
141 }
142
143
144
145#ifdef CHECK_CORRECTNESS_AT_MULT
146 if (d < di) {
147 if (d - di == 0.0)
148 goto mend;
150 mcerr <<
"d < di at the end of computations\n";
151 mcerr <<
"This number:\n";
153 mcerr <<
"Argument:\n";
155 if (d > di)
mcerr <<
"if(d > di) is also positive\n";
156 if (d == di)
mcerr <<
"if(d == di) is also positive\n";
158#ifdef DEBUG_OPERATOR_MULT
159
160 mcerr <<
"old value:\n";
161 temp.print(
mcerr, 6);
162#endif
164 }
165 if (d > da) {
166 if (d == da)
167 goto mend;
169 mcerr <<
"d > di at the end of computations\n";
170 mcerr <<
"This number:\n";
172 mcerr <<
"Argument:\n";
174 if (d < da)
mcerr <<
"if(d < da) is also positive\n";
175 if (d == da)
mcerr <<
"if(d == da) is also positive\n";
177#ifdef DEBUG_OPERATOR_MULT
178
179 mcerr <<
"old value:\n";
180 temp.print(
mcerr, 6);
181#endif
183 }
184mend:
185#endif
186 return *this;
187}
DoubleAc find_min(const DoubleAc &a, const DoubleAc &b)
DoubleAc find_max(const DoubleAc &a, const DoubleAc &b)
#define mfunnamep(string)
void print(std::ostream &file, int l=1) const
#define Iprintn(file, name)