[BACK]Return to bf.c CVS log [TXT][DIR] Up to [local] / OpenXM_contrib2 / asir2000 / engine

Diff for /OpenXM_contrib2/asir2000/engine/bf.c between version 1.8 and 1.9

version 1.8, 2015/08/05 03:46:35 version 1.9, 2015/08/06 00:43:20
Line 1 
Line 1 
 /*  /*
  * $OpenXM: OpenXM_contrib2/asir2000/engine/bf.c,v 1.7 2015/08/04 06:20:45 noro Exp $   * $OpenXM: OpenXM_contrib2/asir2000/engine/bf.c,v 1.8 2015/08/05 03:46:35 noro Exp $
  */   */
 #include "ca.h"  #include "ca.h"
 #include "base.h"  #include "base.h"
Line 85  void addbf(Num a,Num b,Num *c)
Line 85  void addbf(Num a,Num b,Num *c)
     *c = a;      *c = a;
   else if ( (NID(a) <= N_A) && (NID(b) <= N_A ) )    else if ( (NID(a) <= N_A) && (NID(b) <= N_A ) )
     (*addnumt[MIN(NID(a),NID(b))])(a,b,c);      (*addnumt[MIN(NID(a),NID(b))])(a,b,c);
   else {    else if ( NID(a) == N_B ) {
     if ( NID(a) == N_B ) {      switch ( NID(b) ) {
       switch ( NID(b) ) {      case N_Q:
       case N_Q:        mpfr_init2(r,BFPREC(a));
         mpfr_init2(r,BFPREC(a));        if ( INT((Q)b) ) {
         if ( INT((Q)b) ) {          z = ztogz((Q)b);
           z = ztogz((Q)b);          mpfr_add_z(r,((BF)a)->body,z->body,MPFR_RNDN);
           mpfr_add_z(r,((BF)a)->body,z->body,MPFR_RNDN);        } else {
         } else {          q = qtogq((Q)b);
           q = qtogq((Q)b);          mpfr_add_q(r,((BF)a)->body,q->body,MPFR_RNDN);
           mpfr_add_q(r,((BF)a)->body,q->body,MPFR_RNDN);  
         }  
         break;  
       case N_R:  
         /* double precision = 53 */  
         mpfr_init2(r,MIN(BFPREC(a),53));  
         mpfr_add_d(r,((BF)a)->body,((Real)b)->body,MPFR_RNDN);  
         break;  
       case N_B:  
         mpfr_init2(r,MIN(BFPREC(a),BFPREC(b)));  
         mpfr_add(r,((BF)a)->body,((BF)b)->body,MPFR_RNDN);  
         break;  
       }        }
     } else { /* NID(b)==N_B */        break;
       switch ( NID(a) ) {      case N_R:
       case N_Q:        /* double precision = 53 */
         mpfr_init2(r,BFPREC(b));        mpfr_init2(r,MAX(BFPREC(a),53));
         if ( INT((Q)a) ) {        mpfr_add_d(r,((BF)a)->body,((Real)b)->body,MPFR_RNDN);
           z = ztogz((Q)a);        break;
           mpfr_add_z(r,((BF)b)->body,z->body,MPFR_RNDN);      case N_B:
         } else {        mpfr_init2(r,MAX(BFPREC(a),BFPREC(b)));
           q = qtogq((Q)a);        mpfr_add(r,((BF)a)->body,((BF)b)->body,MPFR_RNDN);
           mpfr_add_q(r,((BF)b)->body,q->body,MPFR_RNDN);        break;
         }      }
         break;      MPFRTOBF(r,d);
       case N_R:      *c = (Num)d;
         /* double precision = 53 */    } else { /* NID(b)==N_B */
         mpfr_init2(r,MIN(BFPREC(b),53));      switch ( NID(a) ) {
         mpfr_add_d(r,((BF)b)->body,((Real)a)->body,MPFR_RNDN);      case N_Q:
         break;        mpfr_init2(r,BFPREC(b));
         if ( INT((Q)a) ) {
           z = ztogz((Q)a);
           mpfr_add_z(r,((BF)b)->body,z->body,MPFR_RNDN);
         } else {
           q = qtogq((Q)a);
           mpfr_add_q(r,((BF)b)->body,q->body,MPFR_RNDN);
       }        }
         break;
       case N_R:
         /* double precision = 53 */
         mpfr_init2(r,MAX(BFPREC(b),53));
         mpfr_add_d(r,((BF)b)->body,((Real)a)->body,MPFR_RNDN);
         break;
     }      }
     MPFRTOBF(r,d);      MPFRTOBF(r,d);
     *c = (Num)d;      *c = (Num)d;
Line 145  void subbf(Num a,Num b,Num *c)
Line 145  void subbf(Num a,Num b,Num *c)
     *c = a;      *c = a;
   else if ( (NID(a) <= N_A) && (NID(b) <= N_A ) )    else if ( (NID(a) <= N_A) && (NID(b) <= N_A ) )
     (*subnumt[MIN(NID(a),NID(b))])(a,b,c);      (*subnumt[MIN(NID(a),NID(b))])(a,b,c);
   else {    else if ( NID(a) == N_B ) {
     if ( NID(a) == N_B ) {      switch ( NID(b) ) {
       switch ( NID(b) ) {      case N_Q:
       case N_Q:        mpfr_init2(r,BFPREC(a));
         mpfr_init2(r,BFPREC(a));        if ( INT((Q)b) ) {
         if ( INT((Q)b) ) {          z = ztogz((Q)b);
           z = ztogz((Q)b);          mpfr_sub_z(r,((BF)a)->body,z->body,MPFR_RNDN);
           mpfr_sub_z(r,((BF)a)->body,z->body,MPFR_RNDN);        } else {
         } else {          q = qtogq((Q)b);
           q = qtogq((Q)b);          mpfr_sub_q(r,((BF)a)->body,q->body,MPFR_RNDN);
           mpfr_sub_q(r,((BF)a)->body,q->body,MPFR_RNDN);  
         }  
         break;  
       case N_R:  
         /* double precision = 53 */  
         mpfr_init2(r,MIN(BFPREC(a),53));  
         mpfr_sub_d(r,((BF)a)->body,((Real)b)->body,MPFR_RNDN);  
         break;  
       case N_B:  
         mpfr_init2(r,MIN(BFPREC(a),BFPREC(b)));  
         mpfr_sub(r,((BF)a)->body,((BF)b)->body,MPFR_RNDN);  
         break;  
       }        }
     } else { /* NID(b)==N_B */        break;
       switch ( NID(a) ) {      case N_R:
       case N_Q:        /* double precision = 53 */
         mpfr_init2(s,BFPREC(b));        mpfr_init2(r,MAX(BFPREC(a),53));
         mpfr_init2(r,BFPREC(b));        mpfr_sub_d(r,((BF)a)->body,((Real)b)->body,MPFR_RNDN);
         if ( INT((Q)a) ) {        break;
           z = ztogz((Q)a);      case N_B:
           mpfr_sub_z(s,((BF)b)->body,z->body,MPFR_RNDN);        mpfr_init2(r,MAX(BFPREC(a),BFPREC(b)));
         } else {        mpfr_sub(r,((BF)a)->body,((BF)b)->body,MPFR_RNDN);
           q = qtogq((Q)a);        break;
           mpfr_sub_q(s,((BF)b)->body,q->body,MPFR_RNDN);      }
         }      MPFRTOBF(r,d);
         mpfr_neg(r,s,MPFR_RNDN);      *c = (Num)d;
         break;    } else { /* NID(b)==N_B */
       case N_R:      switch ( NID(a) ) {
         /* double precision = 53 */      case N_Q:
         mpfr_init2(r,MIN(BFPREC(b),53));        mpfr_init2(s,BFPREC(b));
         mpfr_d_sub(r,((Real)a)->body,((BF)b)->body,MPFR_RNDN);        mpfr_init2(r,BFPREC(b));
         break;        if ( INT((Q)a) ) {
           z = ztogz((Q)a);
           mpfr_sub_z(s,((BF)b)->body,z->body,MPFR_RNDN);
         } else {
           q = qtogq((Q)a);
           mpfr_sub_q(s,((BF)b)->body,q->body,MPFR_RNDN);
       }        }
         mpfr_neg(r,s,MPFR_RNDN);
         break;
       case N_R:
         /* double precision = 53 */
         mpfr_init2(r,MAX(BFPREC(b),53));
         mpfr_d_sub(r,((Real)a)->body,((BF)b)->body,MPFR_RNDN);
         break;
     }      }
     MPFRTOBF(r,d);      MPFRTOBF(r,d);
     *c = (Num)d;      *c = (Num)d;
Line 206  void mulbf(Num a,Num b,Num *c)
Line 206  void mulbf(Num a,Num b,Num *c)
     *c = 0;      *c = 0;
   else if ( (NID(a) <= N_A) && (NID(b) <= N_A ) )    else if ( (NID(a) <= N_A) && (NID(b) <= N_A ) )
     (*mulnumt[MIN(NID(a),NID(b))])(a,b,c);      (*mulnumt[MIN(NID(a),NID(b))])(a,b,c);
   else {    else if ( NID(a) == N_B ) {
     if ( NID(a) == N_B ) {      switch ( NID(b) ) {
       switch ( NID(b) ) {      case N_Q:
       case N_Q:        mpfr_init2(r,BFPREC(a));
         mpfr_init2(r,BFPREC(a));        if ( INT((Q)b) ) {
         if ( INT((Q)b) ) {          z = ztogz((Q)b);
           z = ztogz((Q)b);          mpfr_mul_z(r,((BF)a)->body,z->body,MPFR_RNDN);
           mpfr_mul_z(r,((BF)a)->body,z->body,MPFR_RNDN);        } else {
         } else {          q = qtogq((Q)b);
           q = qtogq((Q)b);          mpfr_mul_q(r,((BF)a)->body,q->body,MPFR_RNDN);
           mpfr_mul_q(r,((BF)a)->body,q->body,MPFR_RNDN);  
         }  
         break;  
       case N_R:  
         /* double precision = 53 */  
         mpfr_init2(r,MIN(BFPREC(a),53));  
         mpfr_mul_d(r,((BF)a)->body,((Real)b)->body,MPFR_RNDN);  
         break;  
       case N_B:  
         mpfr_init2(r,MIN(BFPREC(a),BFPREC(b)));  
         mpfr_mul(r,((BF)a)->body,((BF)b)->body,MPFR_RNDN);  
         break;  
       }        }
     } else { /* NID(b)==N_B */        break;
       switch ( NID(a) ) {      case N_R:
       case N_Q:        /* double precision = 53 */
         mpfr_init2(r,BFPREC(b));        mpfr_init2(r,MAX(BFPREC(a),53));
         if ( INT((Q)a) ) {        mpfr_mul_d(r,((BF)a)->body,((Real)b)->body,MPFR_RNDN);
           z = ztogz((Q)a);        break;
           mpfr_mul_z(r,((BF)b)->body,z->body,MPFR_RNDN);      case N_B:
         } else {        mpfr_init2(r,MAX(BFPREC(a),BFPREC(b)));
           q = qtogq((Q)a);        mpfr_mul(r,((BF)a)->body,((BF)b)->body,MPFR_RNDN);
           mpfr_mul_q(r,((BF)b)->body,q->body,MPFR_RNDN);        break;
         }      }
         break;      MPFRTOBF(r,d);
       case N_R:      *c = (Num)d;
         /* double precision = 53 */    } else { /* NID(b)==N_B */
         mpfr_init2(r,MIN(BFPREC(b),53));      switch ( NID(a) ) {
         mpfr_mul_d(r,((BF)b)->body,((Real)a)->body,MPFR_RNDN);      case N_Q:
         break;        mpfr_init2(r,BFPREC(b));
         if ( INT((Q)a) ) {
           z = ztogz((Q)a);
           mpfr_mul_z(r,((BF)b)->body,z->body,MPFR_RNDN);
         } else {
           q = qtogq((Q)a);
           mpfr_mul_q(r,((BF)b)->body,q->body,MPFR_RNDN);
       }        }
         break;
       case N_R:
         /* double precision = 53 */
         mpfr_init2(r,MAX(BFPREC(b),53));
         mpfr_mul_d(r,((BF)b)->body,((Real)a)->body,MPFR_RNDN);
         break;
     }      }
     MPFRTOBF(r,d);      MPFRTOBF(r,d);
     *c = (Num)d;      *c = (Num)d;
Line 266  void divbf(Num a,Num b,Num *c)
Line 266  void divbf(Num a,Num b,Num *c)
     *c = 0;      *c = 0;
   else if ( (NID(a) <= N_A) && (NID(b) <= N_A ) )    else if ( (NID(a) <= N_A) && (NID(b) <= N_A ) )
     (*divnumt[MIN(NID(a),NID(b))])(a,b,c);      (*divnumt[MIN(NID(a),NID(b))])(a,b,c);
   else {    else if ( NID(a) == N_B ) {
     if ( NID(a) == N_B ) {      switch ( NID(b) ) {
       switch ( NID(b) ) {      case N_Q:
       case N_Q:        mpfr_init2(r,BFPREC(a));
         mpfr_init2(r,BFPREC(a));        if ( INT((Q)b) ) {
         if ( INT((Q)b) ) {          z = ztogz((Q)b);
           z = ztogz((Q)b);          mpfr_div_z(r,((BF)a)->body,z->body,MPFR_RNDN);
           mpfr_div_z(r,((BF)a)->body,z->body,MPFR_RNDN);        } else {
         } else {          q = qtogq((Q)b);
           q = qtogq((Q)b);          mpfr_div_q(r,((BF)a)->body,q->body,MPFR_RNDN);
           mpfr_div_q(r,((BF)a)->body,q->body,MPFR_RNDN);  
         }  
         break;  
       case N_R:  
         /* double precision = 53 */  
         mpfr_init2(r,MIN(BFPREC(a),53));  
         mpfr_div_d(r,((BF)a)->body,((Real)b)->body,MPFR_RNDN);  
         break;  
       case N_B:  
         mpfr_init2(r,MIN(BFPREC(a),BFPREC(b)));  
         mpfr_div(r,((BF)a)->body,((BF)b)->body,MPFR_RNDN);  
         break;  
       }        }
     } else { /* NID(b)==N_B */        break;
       switch ( NID(a) ) {      case N_R:
       case N_Q:        /* double precision = 53 */
         /* XXX : mpfr_z_div and mpfr_q_div are not implemented */        mpfr_init2(r,MAX(BFPREC(a),53));
         a = tobf(a,BFPREC(b));        mpfr_div_d(r,((BF)a)->body,((Real)b)->body,MPFR_RNDN);
         mpfr_init2(r,BFPREC(b));        break;
         mpfr_div(r,((BF)a)->body,((BF)b)->body,MPFR_RNDN);      case N_B:
         break;        mpfr_init2(r,MAX(BFPREC(a),BFPREC(b)));
       case N_R:        mpfr_div(r,((BF)a)->body,((BF)b)->body,MPFR_RNDN);
         /* double precision = 53 */        break;
         mpfr_init2(r,MIN(BFPREC(b),53));  
         mpfr_d_div(r,((Real)a)->body,((BF)b)->body,MPFR_RNDN);  
         break;  
       }  
     }      }
     MPFRTOBF(r,d);      MPFRTOBF(r,d);
     *c = (Num)d;      *c = (Num)d;
     } else { /* NID(b)==N_B */
       switch ( NID(a) ) {
       case N_Q:
         /* XXX : mpfr_z_div and mpfr_q_div are not implemented */
         a = tobf(a,BFPREC(b));
         mpfr_init2(r,BFPREC(b));
         mpfr_div(r,((BF)a)->body,((BF)b)->body,MPFR_RNDN);
         break;
       case N_R:
         /* double precision = 53 */
         mpfr_init2(r,MAX(BFPREC(b),53));
         mpfr_d_div(r,((Real)a)->body,((BF)b)->body,MPFR_RNDN);
         break;
       }
       MPFRTOBF(r,d);
       *c = (Num)d;
   }    }
 }  }
   
Line 322  void pwrbf(Num a,Num b,Num *c)
Line 322  void pwrbf(Num a,Num b,Num *c)
     *c = 0;      *c = 0;
   else if ( (NID(a) <= N_A) && (NID(b) <= N_A ) )    else if ( (NID(a) <= N_A) && (NID(b) <= N_A ) )
     (*pwrnumt[MIN(NID(a),NID(b))])(a,b,c);      (*pwrnumt[MIN(NID(a),NID(b))])(a,b,c);
   else {    else if ( NID(a) == N_B ) {
     if ( NID(a) == N_B ) {      switch ( NID(b) ) {
       switch ( NID(b) ) {      case N_Q:
       case N_Q:        mpfr_init2(r,BFPREC(a));
         mpfr_init2(r,BFPREC(a));        if ( INT((Q)b) ) {
         if ( INT((Q)b) ) {          z = ztogz((Q)b);
           z = ztogz((Q)b);          mpfr_pow_z(r,((BF)a)->body,z->body,MPFR_RNDN);
           mpfr_pow_z(r,((BF)a)->body,z->body,MPFR_RNDN);        } else {
         } else {          b = tobf(b,BFPREC(a));
           b = tobf(b,BFPREC(a));  
           mpfr_pow(r,((BF)a)->body,((BF)b)->body,MPFR_RNDN);  
         }  
         break;  
       case N_R:  
         /* double precision = 53 */  
         prec = MIN(BFPREC(a),53);  
         mpfr_init2(r,prec);  
         b = tobf(b,prec);  
         mpfr_pow(r,((BF)a)->body,((BF)b)->body,MPFR_RNDN);          mpfr_pow(r,((BF)a)->body,((BF)b)->body,MPFR_RNDN);
         break;  
       case N_B:  
         mpfr_init2(r,MIN(BFPREC(a),BFPREC(b)));  
         mpfr_pow(r,((BF)a)->body,((BF)b)->body,MPFR_RNDN);  
         break;  
       }        }
     } else { /* NID(b)==N_B */        break;
       switch ( NID(a) ) {      case N_R:
       case N_Q:        /* double precision = 53 */
         mpfr_init2(r,BFPREC(b));        prec = MAX(BFPREC(a),53);
         a = tobf(a,BFPREC(b));        mpfr_init2(r,prec);
         mpfr_pow(r,((BF)a)->body,((BF)b)->body,MPFR_RNDN);        b = tobf(b,prec);
         break;        mpfr_pow(r,((BF)a)->body,((BF)b)->body,MPFR_RNDN);
       case N_R:        break;
         /* double precision = 53 */      case N_B:
         prec = MIN(BFPREC(a),53);        mpfr_init2(r,MAX(BFPREC(a),BFPREC(b)));
         mpfr_init2(r,prec);        mpfr_pow(r,((BF)a)->body,((BF)b)->body,MPFR_RNDN);
         a = tobf(a,prec);        break;
         mpfr_pow(r,((BF)a)->body,((BF)b)->body,MPFR_RNDN);  
         break;  
       }  
     }      }
     MPFRTOBF(r,d);      MPFRTOBF(r,d);
     *c = (Num)d;      *c = (Num)d;
     } else { /* NID(b)==N_B */
       switch ( NID(a) ) {
       case N_Q:
         mpfr_init2(r,BFPREC(b));
         a = tobf(a,BFPREC(b));
         mpfr_pow(r,((BF)a)->body,((BF)b)->body,MPFR_RNDN);
         break;
       case N_R:
         /* double precision = 53 */
         prec = MAX(BFPREC(a),53);
         mpfr_init2(r,prec);
         a = tobf(a,prec);
         mpfr_pow(r,((BF)a)->body,((BF)b)->body,MPFR_RNDN);
         break;
       }
       MPFRTOBF(r,d);
       *c = (Num)d;
   }    }
 }  }
   
Line 387  void chsgnbf(Num a,Num *c)
Line 387  void chsgnbf(Num a,Num *c)
   
 int cmpbf(Num a,Num b)  int cmpbf(Num a,Num b)
 {  {
     int ret;
     GZ z;
     GQ q;
   
   if ( !a ) {    if ( !a ) {
     if ( !b || (NID(b)<=N_A) )      if ( !b || (NID(b)<=N_A) )
       return (*cmpnumt[NID(b)])(a,b);        return (*cmpnumt[NID(b)])(a,b);
Line 397  int cmpbf(Num a,Num b)
Line 401  int cmpbf(Num a,Num b)
       return (*cmpnumt[NID(a)])(a,b);        return (*cmpnumt[NID(a)])(a,b);
     else      else
       return mpfr_sgn(((BF)a)->body);        return mpfr_sgn(((BF)a)->body);
   } else {    } else if ( NID(a) == N_B ) {
     if ( NID(a) != N_B ) a = tobf(a,0);      switch ( NID(b) ) {
     if ( NID(b) != N_B ) b = tobf(b,0);      case N_Q:
     return mpfr_cmp(((BF)a)->body,((BF)b)->body);        if ( INT((Q)b) ) {
           z = ztogz((Q)b);
           ret = mpfr_cmp_z(((BF)a)->body,z->body);
         } else {
           q = qtogq((Q)b);
           ret = mpfr_cmp_q(((BF)a)->body,q->body);
         }
         break;
       case N_R:
         /* double precision = 53 */
         ret = mpfr_cmp_d(((BF)a)->body,((Real)b)->body);
         break;
       case N_B:
         ret = mpfr_cmp(((BF)a)->body,((BF)b)->body);
         break;
       }
       return ret;
     } else { /* NID(b)==N_B */
       switch ( NID(a) ) {
       case N_Q:
         if ( INT((Q)a) ) {
           z = ztogz((Q)a);
           ret = mpfr_cmp_z(((BF)b)->body,z->body);
         } else {
           q = qtogq((Q)a);
           ret = mpfr_cmp_q(((BF)b)->body,q->body);
         }
         break;
       case N_R:
         /* double precision = 53 */
         ret = mpfr_cmp_d(((BF)b)->body,((Real)a)->body);
         break;
       }
       return -ret;
   }    }
 }  }

Legend:
Removed from v.1.8  
changed lines
  Added in v.1.9

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>