(root)/
mpfr-4.2.1/
src/
si_op.c
       1  /* mpfr_add_si -- add a floating-point number with a machine integer
       2     mpfr_sub_si -- sub a floating-point number with a machine integer
       3     mpfr_si_sub -- sub a machine number with a floating-point number
       4     mpfr_mul_si -- multiply a floating-point number by a machine integer
       5     mpfr_div_si -- divide a floating-point number by a machine integer
       6     mpfr_si_div -- divide a machine number by a floating-point number
       7  
       8  Copyright 2004-2023 Free Software Foundation, Inc.
       9  Contributed by the AriC and Caramba projects, INRIA.
      10  
      11  This file is part of the GNU MPFR Library.
      12  
      13  The GNU MPFR Library is free software; you can redistribute it and/or modify
      14  it under the terms of the GNU Lesser General Public License as published by
      15  the Free Software Foundation; either version 3 of the License, or (at your
      16  option) any later version.
      17  
      18  The GNU MPFR Library is distributed in the hope that it will be useful, but
      19  WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
      20  or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
      21  License for more details.
      22  
      23  You should have received a copy of the GNU Lesser General Public License
      24  along with the GNU MPFR Library; see the file COPYING.LESSER.  If not, see
      25  https://www.gnu.org/licenses/ or write to the Free Software Foundation, Inc.,
      26  51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. */
      27  
      28  #include "mpfr-impl.h"
      29  
      30  int
      31  mpfr_add_si (mpfr_ptr y, mpfr_srcptr x, long int u, mpfr_rnd_t rnd_mode)
      32  {
      33    int res;
      34  
      35    MPFR_LOG_FUNC
      36      (("x[%Pd]=%.*Rg u=%ld rnd=%d",
      37        mpfr_get_prec(x), mpfr_log_prec, x, u, rnd_mode),
      38       ("y[%Pd]=%.*Rg inexact=%d",
      39        mpfr_get_prec(y), mpfr_log_prec, y, res));
      40  
      41    if (u >= 0)
      42      res = mpfr_add_ui (y, x, u, rnd_mode);
      43    else
      44      res = mpfr_sub_ui (y, x, - (unsigned long) u, rnd_mode);
      45  
      46    return res;
      47  }
      48  
      49  int
      50  mpfr_sub_si (mpfr_ptr y, mpfr_srcptr x, long int u, mpfr_rnd_t rnd_mode)
      51  {
      52    int res;
      53  
      54    MPFR_LOG_FUNC
      55      (("x[%Pd]=%.*Rg u=%ld rnd=%d",
      56        mpfr_get_prec(x), mpfr_log_prec, x, u, rnd_mode),
      57       ("y[%Pd]=%.*Rg inexact=%d",
      58        mpfr_get_prec(y), mpfr_log_prec, y, res));
      59  
      60    if (u >= 0)
      61      res = mpfr_sub_ui (y, x, u, rnd_mode);
      62    else
      63      res = mpfr_add_ui (y, x, - (unsigned long) u, rnd_mode);
      64  
      65    return res;
      66  }
      67  
      68  int
      69  mpfr_si_sub (mpfr_ptr y, long int u, mpfr_srcptr x, mpfr_rnd_t rnd_mode)
      70  {
      71    int res;
      72  
      73    MPFR_LOG_FUNC
      74      (("x[%Pd]=%.*Rg u=%ld rnd=%d",
      75        mpfr_get_prec(x), mpfr_log_prec, x, u, rnd_mode),
      76       ("y[%Pd]=%.*Rg inexact=%d",
      77        mpfr_get_prec(y), mpfr_log_prec, y, res));
      78  
      79    if (u >= 0)
      80      res = mpfr_ui_sub (y, u, x, rnd_mode);
      81    else
      82      {
      83        res = - mpfr_add_ui (y, x, - (unsigned long) u,
      84                             MPFR_INVERT_RND (rnd_mode));
      85        MPFR_CHANGE_SIGN (y);
      86      }
      87  
      88    return res;
      89  }
      90  
      91  #undef mpfr_mul_si
      92  int
      93  mpfr_mul_si (mpfr_ptr y, mpfr_srcptr x, long int u, mpfr_rnd_t rnd_mode)
      94  {
      95    int res;
      96  
      97    MPFR_LOG_FUNC
      98      (("x[%Pd]=%.*Rg u=%ld rnd=%d",
      99        mpfr_get_prec(x), mpfr_log_prec, x, u, rnd_mode),
     100       ("y[%Pd]=%.*Rg inexact=%d",
     101        mpfr_get_prec(y), mpfr_log_prec, y, res));
     102  
     103    if (u >= 0)
     104      res = mpfr_mul_ui (y, x, u, rnd_mode);
     105    else
     106      {
     107        res = - mpfr_mul_ui (y, x, - (unsigned long) u,
     108                             MPFR_INVERT_RND (rnd_mode));
     109        MPFR_CHANGE_SIGN (y);
     110      }
     111  
     112    return res;
     113  }
     114  
     115  #undef mpfr_div_si
     116  int
     117  mpfr_div_si (mpfr_ptr y, mpfr_srcptr x, long int u, mpfr_rnd_t rnd_mode)
     118  {
     119    int res;
     120  
     121    MPFR_LOG_FUNC
     122      (("x[%Pd]=%.*Rg u=%ld rnd=%d",
     123        mpfr_get_prec(x), mpfr_log_prec, x, u, rnd_mode),
     124       ("y[%Pd]=%.*Rg inexact=%d",
     125        mpfr_get_prec(y), mpfr_log_prec, y, res));
     126  
     127    if (u >= 0)
     128      res = mpfr_div_ui (y, x, u, rnd_mode);
     129    else
     130      {
     131        res = - mpfr_div_ui (y, x, - (unsigned long) u,
     132                             MPFR_INVERT_RND (rnd_mode));
     133        MPFR_CHANGE_SIGN (y);
     134      }
     135  
     136    return res;
     137  }
     138  
     139  int
     140  mpfr_si_div (mpfr_ptr y, long int u, mpfr_srcptr x, mpfr_rnd_t rnd_mode)
     141  {
     142    int res;
     143  
     144    MPFR_LOG_FUNC
     145      (("x[%Pd]=%.*Rg u=%ld rnd=%d",
     146        mpfr_get_prec(x), mpfr_log_prec, x, u, rnd_mode),
     147       ("y[%Pd]=%.*Rg inexact=%d",
     148        mpfr_get_prec(y), mpfr_log_prec, y, res));
     149  
     150    if (u >= 0)
     151      res = mpfr_ui_div (y, u, x, rnd_mode);
     152    else
     153      {
     154        res = - mpfr_ui_div (y, - (unsigned long) u, x,
     155                             MPFR_INVERT_RND(rnd_mode));
     156        MPFR_CHANGE_SIGN (y);
     157      }
     158  
     159    return res;
     160  }