summaryrefslogtreecommitdiff
path: root/ui_div.c
diff options
context:
space:
mode:
authorzimmerma <zimmerma@280ebfd0-de03-0410-8827-d642c229c3f4>2001-10-26 08:40:13 +0000
committerzimmerma <zimmerma@280ebfd0-de03-0410-8827-d642c229c3f4>2001-10-26 08:40:13 +0000
commit6250934d37869d1286facc72cf3ebf2dd5532fdf (patch)
treecc3ef6d4fd590535339572c5f13784abf35685ab /ui_div.c
parent7a1d903eaeb1cbf018fa58ef171d8d709d68ff2f (diff)
downloadmpfr-6250934d37869d1286facc72cf3ebf2dd5532fdf.tar.gz
implemented ternary flag in mpfr_ui_div
git-svn-id: svn://scm.gforge.inria.fr/svn/mpfr/trunk@1400 280ebfd0-de03-0410-8827-d642c229c3f4
Diffstat (limited to 'ui_div.c')
-rw-r--r--ui_div.c43
1 files changed, 27 insertions, 16 deletions
diff --git a/ui_div.c b/ui_div.c
index 712d00dd9..884a56df6 100644
--- a/ui_div.c
+++ b/ui_div.c
@@ -26,7 +26,7 @@ MA 02111-1307, USA. */
#include "mpfr.h"
#include "mpfr-impl.h"
-void
+int
#if __STDC__
mpfr_ui_div (mpfr_ptr y, unsigned long int u, mpfr_srcptr x, mp_rnd_t rnd_mode)
#else
@@ -44,31 +44,42 @@ mpfr_ui_div (y, u, x, rnd_mode)
if (MPFR_IS_NAN(x))
{
MPFR_SET_NAN(y);
- return;
+ MPFR_RET_NAN;
}
MPFR_CLEAR_NAN(y);
- if (MPFR_IS_INF(x))
+ if (MPFR_IS_INF(x)) /* u/Inf = 0 */
{
MPFR_CLEAR_INF(y);
MPFR_SET_ZERO(y);
- if (MPFR_SIGN(x) != MPFR_SIGN(y)) MPFR_CHANGE_SIGN(y);
- return;
+ if (MPFR_SIGN(x) != MPFR_SIGN(y))
+ MPFR_CHANGE_SIGN(y);
+ MPFR_RET(0);
}
MPFR_CLEAR_INF(y);
- if (u) {
- MPFR_INIT1(up, uu, BITS_PER_MP_LIMB, 1);
- count_leading_zeros(cnt, (mp_limb_t) u);
- *up = (mp_limb_t) u << cnt;
- MPFR_EXP(uu) = BITS_PER_MP_LIMB-cnt;
+ if (u)
+ {
+ MPFR_INIT1(up, uu, BITS_PER_MP_LIMB, 1);
+ count_leading_zeros(cnt, (mp_limb_t) u);
+ *up = (mp_limb_t) u << cnt;
+ MPFR_EXP(uu) = BITS_PER_MP_LIMB-cnt;
- mpfr_div(y, uu, x, rnd_mode);
- }
- else {
- if (MPFR_IS_ZERO(x)) MPFR_SET_NAN(y); /* 0/0 */
- else MPFR_SET_ZERO(y); /* if u=0, then set y to 0 */
- }
+ return mpfr_div (y, uu, x, rnd_mode);
+ }
+ else /* u = 0 */
+ {
+ if (MPFR_IS_ZERO(x)) /* 0/0 */
+ {
+ MPFR_SET_NAN(y);
+ MPFR_RET_NAN;
+ }
+ else
+ {
+ MPFR_SET_ZERO(y); /* if u=0, then set y to 0 */
+ MPFR_RET(0);
+ }
+ }
}