summaryrefslogtreecommitdiff
path: root/cosh.c
diff options
context:
space:
mode:
authorzimmerma <zimmerma@280ebfd0-de03-0410-8827-d642c229c3f4>2001-10-15 14:09:24 +0000
committerzimmerma <zimmerma@280ebfd0-de03-0410-8827-d642c229c3f4>2001-10-15 14:09:24 +0000
commit026b5b56cd2a5d9adda1aca584842a1da6b0bb44 (patch)
treeebd04ac8ff3e7917ec73790d1b7c958c57c64511 /cosh.c
parent9a885e9800fd6905cebbd85e3d9850f8d356db81 (diff)
downloadmpfr-026b5b56cd2a5d9adda1aca584842a1da6b0bb44.tar.gz
implement ternary inexact flag
git-svn-id: svn://scm.gforge.inria.fr/svn/mpfr/trunk@1256 280ebfd0-de03-0410-8827-d642c229c3f4
Diffstat (limited to 'cosh.c')
-rw-r--r--cosh.c127
1 files changed, 64 insertions, 63 deletions
diff --git a/cosh.c b/cosh.c
index 453767181..ca956ef15 100644
--- a/cosh.c
+++ b/cosh.c
@@ -1,6 +1,6 @@
-/* mpfr_cosh -- Hyperbolic Cosine of Unsigned Integer Number
+/* mpfr_cosh -- hyperbolic cosine
-Copyright (C) 1999 Free Software Foundation.
+Copyright (C) 1999-2001 Free Software Foundation.
This file is part of the MPFR Library.
@@ -50,84 +50,85 @@ mpfr_cosh (y, x, rnd_mode)
/* Variable of Intermediary Calculation*/
mpfr_t te,ti;
- int round;
- int boucle;
+ int round, inexact = 0;
+ int boucle = 1;
mp_prec_t Nx; /* Precision of input variable */
mp_prec_t Ny; /* Precision of output variable */
mp_prec_t Nt; /* Precision of Intermediary Calculation variable */
mp_prec_t err; /* Precision of error */
- if (MPFR_IS_NAN(x)) { MPFR_SET_NAN(y); return 1; }
+ if (MPFR_IS_NAN(x))
+ {
+ MPFR_SET_NAN(y);
+ return 1;
+ }
+
MPFR_CLEAR_NAN(y);
- if (MPFR_IS_INF(x)){
- MPFR_SET_INF(y);
- if (MPFR_SIGN(y) < 0) MPFR_CHANGE_SIGN(y);
- return 1;
- }
+ if (MPFR_IS_INF(x))
+ {
+ MPFR_SET_INF(y);
+ if (MPFR_SIGN(y) < 0)
+ MPFR_CHANGE_SIGN(y);
+ return 0;
+ }
MPFR_CLEAR_INF(y);
- if(!MPFR_NOTZERO(x)){
- mpfr_set_ui(y,1,GMP_RNDN); /* cosh(0) = 1 */
- return(0);
- }
- else{
-
- /* Initialisation of the Precision */
- Nx=MPFR_PREC(x);
- Ny=MPFR_PREC(y);
-
- /* compute the size of intermediary variable */
- if(Ny>=Nx)
- Nt=Ny+2*(BITS_PER_CHAR);
+ if(!MPFR_NOTZERO(x))
+ {
+ mpfr_set_ui (y, 1, GMP_RNDN); /* cosh(0) = 1 */
+ return 0;
+ }
+
+ /* Initialisation of the Precision */
+ Nx=MPFR_PREC(x);
+ Ny=MPFR_PREC(y);
+
+ /* compute the size of intermediary variable */
+ if (Ny >= Nx)
+ Nt = Ny + 2 * BITS_PER_CHAR;
else
- Nt=Nx+2*(BITS_PER_CHAR);
+ Nt = Nx + 2 * BITS_PER_CHAR;
- boucle=1;
-
- /* initialise of intermediary variable */
- mpfr_init2(t,Nt);
- mpfr_init2(te,Nt);
- mpfr_init2(ti,Nt);
-
- while(boucle==1){
+ /* initialize intermediary variables */
+ mpfr_init2 (t, Nt);
+ mpfr_init2 (te, Nt);
+ mpfr_init2 (ti, Nt);
+ while (boucle)
+ {
- /* compute cosh */
- mpfr_exp(te,x,GMP_RNDN); /* exp(x) */
- mpfr_ui_div(ti,1,te,GMP_RNDN); /* 1/exp(x) */
- mpfr_add(t,te,ti,GMP_RNDN); /* exp(x) + 1/exp(x)*/
- mpfr_div_2exp(t,t,1,GMP_RNDN); /* 1/2(exp(x) + 1/exp(x))*/
-
- err=Nt-1;
-
- round=mpfr_can_round(t,err,GMP_RNDN,rnd_mode,Ny);
-
- if(round == 1){
- mpfr_set(y,t,rnd_mode);
- boucle=0;
- }
- else{
- Nt=Nt+10;
- /* re-initialise of intermediary variable */
- mpfr_set_prec(t,Nt);
- mpfr_set_prec(te,Nt);
- mpfr_set_prec(ti,Nt);
-
- boucle=1;
- }
-
-
+ /* compute cosh */
+ mpfr_exp (te, x, GMP_RNDN); /* exp(x) */
+ mpfr_ui_div (ti, 1, te, GMP_RNDN); /* 1/exp(x) */
+ mpfr_add (t, te, ti, GMP_RNDN); /* exp(x) + 1/exp(x)*/
+ mpfr_div_2exp (t, t, 1, GMP_RNDN); /* 1/2(exp(x) + 1/exp(x))*/
+
+ err = Nt - 1;
+
+ round = mpfr_can_round (t, err, GMP_RNDN, rnd_mode, Ny);
+
+ if (round)
+ {
+ inexact = mpfr_set (y, t, rnd_mode);
+ boucle=0;
+ }
+ else
+ {
+ Nt += 10;
+ /* re-initialize intermediary variables */
+ mpfr_set_prec (t, Nt);
+ mpfr_set_prec (te, Nt);
+ mpfr_set_prec (ti, Nt);
}
- mpfr_clear(t);
- mpfr_clear(ti);
- mpfr_clear(te);
- return(1);
+ }
+ mpfr_clear (t);
+ mpfr_clear (ti);
+ mpfr_clear (te);
-
- }
+ return inexact;
}