Blame mpc-0.9/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) INRIA, 2005, 2009, 2010
Packit Service 2e9770
Packit Service 2e9770
This file is part of the MPC Library.
Packit Service 2e9770
Packit Service 2e9770
The MPC Library is free software; you can redistribute it and/or modify
Packit Service 2e9770
it under the terms of the GNU Lesser General Public License as published by
Packit Service 2e9770
the Free Software Foundation; either version 2.1 of the License, or (at your
Packit Service 2e9770
option) any later version.
Packit Service 2e9770
Packit Service 2e9770
The MPC Library is distributed in the hope that it will be useful, but
Packit Service 2e9770
WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
Packit Service 2e9770
or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
Packit Service 2e9770
License for 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 the MPC Library; see the file COPYING.LIB.  If not, write to
Packit Service 2e9770
the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
Packit Service 2e9770
MA 02111-1307, USA. */
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_RE (a), MPC_IM (a));
Packit Service 2e9770
     else
Packit Service 2e9770
     {
Packit Service 2e9770
        mpfr_set (MPC_RE (a), MPC_IM (b), GMP_RNDN);
Packit Service 2e9770
        mpfr_set (MPC_IM (a), MPC_RE (b), GMP_RNDN);
Packit Service 2e9770
     }
Packit Service 2e9770
     if (sign >= 0)
Packit Service 2e9770
        MPFR_CHANGE_SIGN (MPC_RE (a));
Packit Service 2e9770
     else
Packit Service 2e9770
        MPFR_CHANGE_SIGN (MPC_IM (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_IM (b), MPC_RND_RE (rnd));
Packit Service 2e9770
           inex_im = mpfr_set (MPC_IM (a), MPC_RE (b), MPC_RND_IM (rnd));
Packit Service 2e9770
        }
Packit Service 2e9770
        else
Packit Service 2e9770
        {
Packit Service 2e9770
           inex_re = mpfr_set (tmp, MPC_IM (b), MPC_RND_RE (rnd));
Packit Service 2e9770
           inex_im = mpfr_neg (MPC_IM (a), MPC_RE (b), MPC_RND_IM (rnd));
Packit Service 2e9770
        }
Packit Service 2e9770
        mpfr_clear (MPC_RE (a));
Packit Service 2e9770
        MPC_RE (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_RE (a), MPC_IM (b), MPC_RND_RE (rnd));
Packit Service 2e9770
           inex_im = mpfr_set (MPC_IM (a), MPC_RE (b), MPC_RND_IM (rnd));
Packit Service 2e9770
        }
Packit Service 2e9770
        else
Packit Service 2e9770
        {
Packit Service 2e9770
           inex_re = mpfr_set (MPC_RE (a), MPC_IM (b), MPC_RND_RE (rnd));
Packit Service 2e9770
           inex_im = mpfr_neg (MPC_IM (a), MPC_RE (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
}