Home | History | Annotate | Line # | Download | only in src
      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 }
    161