70 mpfr_init2(tmp, mpfr_get_prec(a->re));
73 mpfr_mul(tmp, a->re, b->re, MPFR_RNDN);
74 mpfr_set(
result->re, tmp, MPFR_RNDN);
75 mpfr_mul(tmp, a->im, b->im, MPFR_RNDN);
79 mpfr_mul(tmp, a->re, b->im, MPFR_RNDN);
80 mpfr_set(
result->im, tmp, MPFR_RNDN);
81 mpfr_mul(tmp, a->im, b->re, MPFR_RNDN);
89 mpfr_init2(
p, mpfr_get_prec(v->re));
90 mpfr_init2(denom, mpfr_get_prec(v->re));
92 if (mpfr_cmpabs(v->re, v->im) >= 0)
99 mpfr_div(
p, v->im, v->re, MPFR_RNDN);
100 mpfr_mul(denom,
p, v->im, MPFR_RNDN);
101 mpfr_add(denom, denom, v->re, MPFR_RNDN);
102 mpfr_si_div(
result->re, 1, denom, MPFR_RNDN);
103 mpfr_div(
result->im,
p, denom, MPFR_RNDN);
113 mpfr_div(
p, v->re, v->im, MPFR_RNDN);
114 mpfr_mul(denom,
p, v->re, MPFR_RNDN);
115 mpfr_add(denom, denom, v->im, MPFR_RNDN);
116 mpfr_si_div(
result->im, 1, denom, MPFR_RNDN);
118 mpfr_div(
result->re,
p, denom, MPFR_RNDN);
127 mpfr_init2(
p, mpfr_get_prec(u->re));
128 mpfr_init2(denom, mpfr_get_prec(u->re));
130 printf(
"not expected to be used -- we have a bug here\n");
132 if (mpfr_cmpabs(v->re, v->im) >= 0)
144 mpfr_div(
p, v->im, v->re, MPFR_RNDN);
145 mpfr_mul(denom,
p, v->im, MPFR_RNDN);
146 mpfr_add(denom, denom, v->re, MPFR_RNDN);
148 mpfr_mul(
result->re,
p, u->im, MPFR_RNDN);
152 mpfr_mul(
result->im,
p, u->re, MPFR_RNDN);
164 mpfr_div(
p, v->re, v->im, MPFR_RNDN);
165 mpfr_mul(denom,
p, v->re, MPFR_RNDN);
166 mpfr_add(denom, denom, v->im, MPFR_RNDN);
168 mpfr_mul(
result->re,
p, u->re, MPFR_RNDN);
172 mpfr_mul(
result->im,
p, u->im, MPFR_RNDN);
180 if (fabs(v.re) >= fabs(v.im))
186 double p = v.im/v.re;
187 double denom = v.re +
p * v.im;
188 result.re = (u.re +
p*u.im)/denom;
189 result.im = (u.im -
p*u.re)/denom;
193 double p = v.re/v.im;
194 double denom = v.im +
p * v.re;
195 result.re = (u.re *
p + u.im)/denom;
196 result.im = (-u.re +
p * u.im)/denom;
206 mpfr_init2(tmp, mpfr_get_prec(a->re));
208 mpfr_mul(tmp, a->re, b->re, MPFR_RNDN);
210 mpfr_mul(tmp, a->im, b->im, MPFR_RNDN);
213 mpfr_mul(tmp, a->re, b->im, MPFR_RNDN);
215 mpfr_mul(tmp, a->im, b->re, MPFR_RNDN);
229 mpfr_init2(a, mpfr_get_prec(c->re));
230 mpfr_init2(b, mpfr_get_prec(c->re));
231 mpfr_abs(a, c->re, MPFR_RNDN);
232 mpfr_abs(b, c->im, MPFR_RNDN);
234 mpfr_set(
result, b, MPFR_RNDN);
235 else if (mpfr_zero_p(b))
236 mpfr_set(
result, a, MPFR_RNDN);
237 else if (mpfr_greater_p(a, b))
242 mpfr_div(b, b, a, MPFR_RNDN);
243 mpfr_sqr(b, b, MPFR_RNDN);
244 mpfr_add_si(b, b, 1, MPFR_RNDN);
245 mpfr_sqrt(b, b, MPFR_RNDN);
246 mpfr_mul(
result, a, b, MPFR_RNDN);
253 mpfr_div(a, a, b, MPFR_RNDN);
254 mpfr_sqr(a, a, MPFR_RNDN);
255 mpfr_add_si(a, a, 1, MPFR_RNDN);
256 mpfr_sqrt(a, a, MPFR_RNDN);
257 mpfr_mul(
result, b, a, MPFR_RNDN);
265 double a = fabs(c.re);
266 double b = fabs(c.im);
268 else if (b == 0.0)
result = a;
272 result = a * ::sqrt(1.0 + d*d);
277 result = b * ::sqrt(1.0 + d*d);
291 if (mpfr_zero_p(a->re) && mpfr_zero_p(a->im))
293 mpfr_set_si(
result->re, 0, MPFR_RNDN);
294 mpfr_set_si(
result->im, 0, MPFR_RNDN);
300 unsigned long p = mpfr_get_prec(a->re);
308 mpfr_abs(b, a->re, MPFR_RNDN);
309 mpfr_abs(c, a->im, MPFR_RNDN);
310 if (mpfr_greater_p(b, c))
315 mpfr_div(d, c, b, MPFR_RNDN);
316 mpfr_sqr(d, d, MPFR_RNDN);
317 mpfr_add_si(d, d, 1, MPFR_RNDN);
318 mpfr_sqrt(d, d, MPFR_RNDN);
319 mpfr_add_si(d, d, 1, MPFR_RNDN);
320 mpfr_div_2ui(d, d, 1, MPFR_RNDN);
321 mpfr_sqrt(d, d, MPFR_RNDN);
322 mpfr_sqrt(b, b, MPFR_RNDN);
323 mpfr_mul(d, d, b, MPFR_RNDN);
329 mpfr_div(d, b, c, MPFR_RNDN);
330 mpfr_sqr(d2, d, MPFR_RNDN);
331 mpfr_add_si(d2, d2, 1, MPFR_RNDN);
332 mpfr_sqrt(d2, d2, MPFR_RNDN);
333 mpfr_add(d, d2, d, MPFR_RNDN);
334 mpfr_div_2ui(d, d, 1, MPFR_RNDN);
335 mpfr_sqrt(d, d, MPFR_RNDN);
336 mpfr_sqrt(c, c, MPFR_RNDN);
337 mpfr_mul(d, d, c, MPFR_RNDN);
339 if (mpfr_sgn(a->re) >= 0)
343 mpfr_set(
result->re, d, MPFR_RNDN);
344 mpfr_mul_2ui(d, d, 1, MPFR_RNDN);
345 mpfr_div(
result->im, a->im, d, MPFR_RNDN);
351 mpfr_set(
result->im, d, MPFR_RNDN);
352 if (mpfr_sgn(a->im) < 0) mpfr_neg(
result->im,
result->im, MPFR_RNDN);
353 mpfr_mul_2ui(d,
result->im, 1, MPFR_RNDN);
354 mpfr_div(
result->re, a->im, d, MPFR_RNDN);
363 static void sqrt(elem &
result, elem a)
366 if (a.re == 0.0 && a.im == 0.0)
378 e = ::sqrt(b) * ::sqrt(0.5 * (1.0 + ::sqrt(1.0 + d*d)));
383 e = ::sqrt(c) * ::sqrt(0.5 * (d + ::sqrt(1.0 + d*d)));
389 result.im = a.im/(2.0 * e);
393 result.im = (a.im >= 0.0 ? e : -e);