version 1.5, 2003/10/20 07:18:42 |
version 1.7, 2009/03/27 14:42:29 |
|
|
/* |
/* |
* $OpenXM: OpenXM_contrib2/asir2000/engine/f-itv.c,v 1.4 2003/07/25 12:34:47 kondoh Exp $ |
* $OpenXM: OpenXM_contrib2/asir2000/engine/f-itv.c,v 1.6 2005/01/11 07:12:51 saito Exp $ |
*/ |
*/ |
#if defined(INTERVAL) |
#if defined(INTERVAL) |
#include "ca.h" |
#include "ca.h" |
|
|
#if defined(PARI) |
#if defined(PARI) |
#include "genpari.h" |
#include "genpari.h" |
#include "itv-pari.h" |
#include "itv-pari.h" |
extern long prec; |
long get_pariprec(); |
#endif |
#endif |
|
|
void ToBf(Num a, BF *rp) |
void ToBf(Num a, BF *rp) |
Line 24 void ToBf(Num a, BF *rp) |
|
Line 24 void ToBf(Num a, BF *rp) |
|
case N_Q: |
case N_Q: |
ltop = avma; |
ltop = avma; |
ritopa_i(NM((Q)a), SGN((Q)a), &pa); |
ritopa_i(NM((Q)a), SGN((Q)a), &pa); |
pb = cgetr(prec); |
pb = cgetr(get_pariprec()); |
mpaff(pa, pb); |
mpaff(pa, pb); |
if ( INT((Q)a) ) { |
if ( INT((Q)a) ) { |
lbot = avma; |
lbot = avma; |
Line 35 void ToBf(Num a, BF *rp) |
|
Line 35 void ToBf(Num a, BF *rp) |
|
} else { |
} else { |
patori(pb, &bn); |
patori(pb, &bn); |
ritopa_i(DN((Q)a), 1, &pa); |
ritopa_i(DN((Q)a), 1, &pa); |
pb = cgetr(prec); |
pb = cgetr(get_pariprec()); |
mpaff(pa, pb); |
mpaff(pa, pb); |
lbot = avma; |
lbot = avma; |
pb = gerepile(ltop, lbot, pb); |
pb = gerepile(ltop, lbot, pb); |
Line 135 printexpr(CO, bi); |
|
Line 135 printexpr(CO, bi); |
|
printexpr(CO, bs); |
printexpr(CO, bs); |
#endif |
#endif |
|
|
#if 1 |
|
addnum(0,ai,bi,&inf); |
addnum(0,ai,bi,&inf); |
addnum(0,as,bs,&sup); |
addnum(0,as,bs,&sup); |
istoitv(inf,sup,(Itv *)&tmp); |
istoitv(inf,sup,(Itv *)&tmp); |
addulp((IntervalBigFloat)tmp, c); |
addulp((IntervalBigFloat)tmp, c); |
return; |
return; |
#else |
|
ltop = avma; |
|
ritopa(ai,&pa); |
|
ritopa(bi,&pb); |
|
lbot = avma; |
|
z = gerepile(ltop,lbot,PariAddDown(pa,pb)); |
|
patori(z,&inf); cgiv(z); |
|
|
|
/* MUST check if ai, as, bi, bs are bigfloat. */ |
|
|
|
/* as + bs = ( - ( (-as) + (-bs) ) ) */ |
|
chsgnbf(as,&mas); |
|
chsgnbf(bs,&mbs); |
|
ltop = avma; |
|
ritopa(mas,&pa); |
|
ritopa(mbs,&pb); |
|
lbot = avma; |
|
z = gerepile(ltop,lbot,PariAddDown(pa,pb)); |
|
patori(z,&tmp); cgiv(z); |
|
|
|
chsgnbf(tmp,&sup); |
|
istoitv(inf,sup,c); |
|
#endif |
|
} |
} |
} |
} |
|
|
Line 185 void subitvf(IntervalBigFloat a, IntervalBigFloat b, I |
|
Line 161 void subitvf(IntervalBigFloat a, IntervalBigFloat b, I |
|
ToBf(inf, (BF *)&ai); ToBf(sup, (BF *)&as); |
ToBf(inf, (BF *)&ai); ToBf(sup, (BF *)&as); |
itvtois((Itv)b,&inf,&sup); |
itvtois((Itv)b,&inf,&sup); |
ToBf(inf, (BF *)&bi); ToBf(sup, (BF *)&bs); |
ToBf(inf, (BF *)&bi); ToBf(sup, (BF *)&bs); |
#if 1 |
|
subnum(0,ai,bs,&inf); |
subnum(0,ai,bs,&inf); |
subnum(0,as,bi,&sup); |
subnum(0,as,bi,&sup); |
istoitv(inf,sup,(Itv *)&tmp); |
istoitv(inf,sup,(Itv *)&tmp); |
addulp((IntervalBigFloat)tmp, c); |
addulp((IntervalBigFloat)tmp, c); |
#else |
|
|
|
/* MUST check if ai, as, bi, bs are bigfloat. */ |
|
/* ai - bs = ai + (-bs) */ |
|
chsgnbf(bs,&mbs); |
|
ltop = avma; |
|
ritopa(ai,&pa); |
|
ritopa(mbs,&pb); |
|
lbot = avma; |
|
z = gerepile(ltop,lbot,PariAddDown(pa,pb)); |
|
patori(z,&inf); cgiv(z); |
|
|
|
/* as - bi = ( - ( bi + (-as) ) ) */ |
|
chsgnbf(as,&mas); |
|
ltop = avma; |
|
ritopa(mas,&pa); |
|
ritopa(bi,&pb); |
|
lbot = avma; |
|
z = gerepile(ltop,lbot,PariAddDown(pa,pb)); |
|
patori(z,&tmp); cgiv(z); |
|
|
|
chsgnbf(tmp,&sup); |
|
istoitv(inf,sup,c); |
|
#endif |
|
} |
} |
} |
} |
|
|
Line 369 void pwritvf(Itv a, Num e, Itv *c) |
|
Line 320 void pwritvf(Itv a, Num e, Itv *c) |
|
pwrnum(0,(Num)a,e,(Num *)c); |
pwrnum(0,(Num)a,e,(Num *)c); |
else if ( !INT(e) ) { |
else if ( !INT(e) ) { |
#if defined(PARI) && 0 |
#if defined(PARI) && 0 |
GEN pa,pe,z; |
gpui_ri((Obj)a,(Obj)c,(Obj *)c); |
int ltop,lbot; |
|
|
|
ltop = avma; ritopa(a,&pa); ritopa(e,&pe); lbot = avma; |
|
z = gerepile(ltop,lbot,gpui(pa,pe,prec)); |
|
patori(z,c); cgiv(z); |
|
#else |
#else |
error("pwritv : can't calculate a fractional power"); |
error("pwritv : can't calculate a fractional power"); |
#endif |
#endif |