Home | History | Annotate | Line # | Download | only in src
      1 /* mpc_mul_fr -- Multiply a complex number by a floating-point number.
      2 
      3 Copyright (C) 2002, 2008, 2009, 2010, 2011, 2012 INRIA
      4 
      5 This file is part of GNU MPC.
      6 
      7 GNU MPC is free software; you can redistribute it and/or modify it under
      8 the terms of the GNU Lesser General Public License as published by the
      9 Free Software Foundation; either version 3 of the License, or (at your
     10 option) any later version.
     11 
     12 GNU MPC is distributed in the hope that it will be useful, but WITHOUT ANY
     13 WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
     14 FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for
     15 more details.
     16 
     17 You should have received a copy of the GNU Lesser General Public License
     18 along with this program. If not, see http://www.gnu.org/licenses/ .
     19 */
     20 
     21 #include "mpc-impl.h"
     22 
     23 int
     24 mpc_mul_fr (mpc_ptr a, mpc_srcptr b, mpfr_srcptr c, mpc_rnd_t rnd)
     25 {
     26   int inex_re, inex_im;
     27   mpfr_t real;
     28 
     29   if (c == mpc_realref (a))
     30     /* We have to use a temporary variable. */
     31     mpfr_init2 (real, MPC_PREC_RE (a));
     32   else
     33     real [0] = mpc_realref (a) [0];
     34 
     35   inex_re = mpfr_mul (real, mpc_realref(b), c, MPC_RND_RE(rnd));
     36   inex_im = mpfr_mul (mpc_imagref(a), mpc_imagref(b), c, MPC_RND_IM(rnd));
     37   mpfr_set (mpc_realref (a), real, MPFR_RNDN); /* exact */
     38 
     39   if (c == mpc_realref (a))
     40     mpfr_clear (real);
     41 
     42   return MPC_INEX(inex_re, inex_im);
     43 }
     44