Blame src/mul_i.c

Packit Service 2e9770
/* mpc_mul_i -- Multiply a complex number by plus or minus i.
Packit Service 2e9770
Packit Service 2e9770
Copyright (C) 2005, 2009, 2010, 2011, 2012 INRIA
Packit Service 2e9770
Packit Service 2e9770
This file is part of GNU MPC.
Packit Service 2e9770
Packit Service 2e9770
GNU MPC is free software; you can redistribute it and/or modify it under
Packit Service 2e9770
the terms of the GNU Lesser General Public License as published by the
Packit Service 2e9770
Free Software Foundation; either version 3 of the License, or (at your
Packit Service 2e9770
option) any later version.
Packit Service 2e9770
Packit Service 2e9770
GNU MPC is distributed in the hope that it will be useful, but WITHOUT ANY
Packit Service 2e9770
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
Packit Service 2e9770
FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for
Packit Service 2e9770
more details.
Packit Service 2e9770
Packit Service 2e9770
You should have received a copy of the GNU Lesser General Public License
Packit Service 2e9770
along with this program. If not, see http://www.gnu.org/licenses/ .
Packit Service 2e9770
*/
Packit Service 2e9770
Packit Service 2e9770
#include "mpc-impl.h"
Packit Service 2e9770
Packit Service 2e9770
int
Packit Service 2e9770
mpc_mul_i (mpc_ptr a, mpc_srcptr b, int sign, mpc_rnd_t rnd)
Packit Service 2e9770
/* if sign is >= 0, multiply by i, otherwise by -i */
Packit Service 2e9770
{
Packit Service 2e9770
  int   inex_re, inex_im;
Packit Service 2e9770
  mpfr_t tmp;
Packit Service 2e9770
Packit Service 2e9770
  /* Treat the most probable case of compatible precisions first */
Packit Service 2e9770
  if (     MPC_PREC_RE (b) == MPC_PREC_IM (a)
Packit Service 2e9770
        && MPC_PREC_IM (b) == MPC_PREC_RE (a))
Packit Service 2e9770
  {
Packit Service 2e9770
     if (a == b)
Packit Service 2e9770
        mpfr_swap (mpc_realref (a), mpc_imagref (a));
Packit Service 2e9770
     else
Packit Service 2e9770
     {
Packit Service 2e9770
        mpfr_set (mpc_realref (a), mpc_imagref (b), MPFR_RNDN);
Packit Service 2e9770
        mpfr_set (mpc_imagref (a), mpc_realref (b), MPFR_RNDN);
Packit Service 2e9770
     }
Packit Service 2e9770
     if (sign >= 0)
Packit Service 2e9770
        MPFR_CHANGE_SIGN (mpc_realref (a));
Packit Service 2e9770
     else
Packit Service 2e9770
        MPFR_CHANGE_SIGN (mpc_imagref (a));
Packit Service 2e9770
     inex_re = 0;
Packit Service 2e9770
     inex_im = 0;
Packit Service 2e9770
  }
Packit Service 2e9770
  else
Packit Service 2e9770
  {
Packit Service 2e9770
     if (a == b)
Packit Service 2e9770
     {
Packit Service 2e9770
        mpfr_init2 (tmp, MPC_PREC_RE (a));
Packit Service 2e9770
        if (sign >= 0)
Packit Service 2e9770
        {
Packit Service 2e9770
           inex_re = mpfr_neg (tmp, mpc_imagref (b), MPC_RND_RE (rnd));
Packit Service 2e9770
           inex_im = mpfr_set (mpc_imagref (a), mpc_realref (b), MPC_RND_IM (rnd));
Packit Service 2e9770
        }
Packit Service 2e9770
        else
Packit Service 2e9770
        {
Packit Service 2e9770
           inex_re = mpfr_set (tmp, mpc_imagref (b), MPC_RND_RE (rnd));
Packit Service 2e9770
           inex_im = mpfr_neg (mpc_imagref (a), mpc_realref (b), MPC_RND_IM (rnd));
Packit Service 2e9770
        }
Packit Service 2e9770
        mpfr_clear (mpc_realref (a));
Packit Service 2e9770
        mpc_realref (a)[0] = tmp [0];
Packit Service 2e9770
     }
Packit Service 2e9770
     else
Packit Service 2e9770
        if (sign >= 0)
Packit Service 2e9770
        {
Packit Service 2e9770
           inex_re = mpfr_neg (mpc_realref (a), mpc_imagref (b), MPC_RND_RE (rnd));
Packit Service 2e9770
           inex_im = mpfr_set (mpc_imagref (a), mpc_realref (b), MPC_RND_IM (rnd));
Packit Service 2e9770
        }
Packit Service 2e9770
        else
Packit Service 2e9770
        {
Packit Service 2e9770
           inex_re = mpfr_set (mpc_realref (a), mpc_imagref (b), MPC_RND_RE (rnd));
Packit Service 2e9770
           inex_im = mpfr_neg (mpc_imagref (a), mpc_realref (b), MPC_RND_IM (rnd));
Packit Service 2e9770
        }
Packit Service 2e9770
  }
Packit Service 2e9770
Packit Service 2e9770
  return MPC_INEX(inex_re, inex_im);
Packit Service 2e9770
}