Macaulay2 Engine
Loading...
Searching...
No Matches

◆ divide() [1/2]

void M2::ARingCCC::divide ( ElementType & res,
const ElementType & a,
const ElementType & b ) const
inline

Definition at line 388 of file aring-CCC.hpp.

391 {
392 mpfr_t p, denom;
393 mpfr_init2(p, get_precision());
394 mpfr_init2(denom, get_precision());
395 Element result(*this);
396
397 if (mpfr_cmpabs(&b.re, &b.im) >= 0)
398 {
399 // for v = c + d*i,
400 // p = d/c
401 // c+di = c(1+p*i), so denom is c(1+p^2)
402 // which is c + d*p
403
404 // double p = v.im/v.re;
405 // double denom = v.re + p * v.im;
406 // result.re = (u.re + p*u.im)/denom;
407 // result.im = (u.im - p*u.re)/denom;
408
409 mpfr_div(p, &b.im, &b.re, MPFR_RNDN);
410 mpfr_mul(denom, p, &b.im, MPFR_RNDN);
411 mpfr_add(denom, denom, &b.re, MPFR_RNDN);
412
413 mpfr_mul(&result.value().re, p, &a.im, MPFR_RNDN);
414 mpfr_add(&result.value().re, &result.value().re, &a.re, MPFR_RNDN);
415 mpfr_div(&result.value().re, &result.value().re, denom, MPFR_RNDN);
416
417 mpfr_mul(&result.value().im, p, &a.re, MPFR_RNDN);
418 mpfr_neg(&result.value().im, &result.value().im, MPFR_RNDN);
419 mpfr_add(&result.value().im, &result.value().im, &a.im, MPFR_RNDN);
420 mpfr_div(&result.value().im, &result.value().im, denom, MPFR_RNDN);
421 }
422 else
423 {
424 // double p = v.re/v.im;
425 // double denom = v.im + p * v.re;
426 // result.re = (u.re * p + u.im)/denom;
427 // result.im = (-u.re + p * u.im)/denom;
428
429 mpfr_div(p, &b.re, &b.im, MPFR_RNDN);
430 mpfr_mul(denom, p, &b.re, MPFR_RNDN);
431 mpfr_add(denom, denom, &b.im, MPFR_RNDN);
432
433 mpfr_mul(&result.value().re, p, &a.re, MPFR_RNDN);
434 mpfr_add(&result.value().re, &result.value().re, &a.im, MPFR_RNDN);
435 mpfr_div(&result.value().re, &result.value().re, denom, MPFR_RNDN);
436
437 mpfr_mul(&result.value().im, p, &a.im, MPFR_RNDN);
438 mpfr_sub(&result.value().im, &result.value().im, &a.re, MPFR_RNDN);
439 mpfr_div(&result.value().im, &result.value().im, denom, MPFR_RNDN);
440 }
441 mpfr_clear(p);
442 mpfr_clear(denom);
443 set(res, result);
444 }
unsigned long get_precision() const
Definition aring-CCC.hpp:88
void set(ElementType &result, const ElementType &a) const
int p
VALGRIND_MAKE_MEM_DEFINED & result(result)

References get_precision(), cc_struct::im, p, cc_struct::re, result(), and set().