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[%Pu]=%.*Rg u=%ld rnd=%d", 37 mpfr_get_prec(x), mpfr_log_prec, x, u, rnd_mode), 38 ("y[%Pu]=%.*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[%Pu]=%.*Rg u=%ld rnd=%d", 56 mpfr_get_prec(x), mpfr_log_prec, x, u, rnd_mode), 57 ("y[%Pu]=%.*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[%Pu]=%.*Rg u=%ld rnd=%d", 75 mpfr_get_prec(x), mpfr_log_prec, x, u, rnd_mode), 76 ("y[%Pu]=%.*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[%Pu]=%.*Rg u=%ld rnd=%d", 99 mpfr_get_prec(x), mpfr_log_prec, x, u, rnd_mode), 100 ("y[%Pu]=%.*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[%Pu]=%.*Rg u=%ld rnd=%d", 123 mpfr_get_prec(x), mpfr_log_prec, x, u, rnd_mode), 124 ("y[%Pu]=%.*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[%Pu]=%.*Rg u=%ld rnd=%d", 146 mpfr_get_prec(x), mpfr_log_prec, x, u, rnd_mode), 147 ("y[%Pu]=%.*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