comparison vm.c @ 0:e0bbaa717f41 draft default tip

lol J
author Jordi Gutiérrez Hermoso <jordigh@octave.org>
date Mon, 25 Nov 2013 11:56:30 -0500
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:e0bbaa717f41
1 /* Copyright 1990-2011, Jsoftware Inc. All rights reserved. */
2 /* License in license.txt. */
3 /* */
4 /* Verbs: "Mathematical" Functions (Irrational, Transcendental, etc.) */
5
6 #include "j.h"
7 #include "ve.h"
8
9 static D jtintpow(J jt,D x,I n){D r=1;
10 if(0>n){x=1/x; if(n==IMIN){r=x; n=IMAX;} else n=-n;}
11 while(n){if(1&n)r*=x; x*=x; n>>=1;}
12 R r;
13 } /* x^n where x is real and n is integral */
14
15 static D jtpospow(J jt,D x,D y){
16 if(0==y)R 1.0;
17 if(0==x)R 0<y?0.0:inf;
18 if(0<x){
19 if(y== inf)R 1<x?inf:1>x?0.0:1.0;
20 if(y==-inf)R 1<x?0.0:1>x?inf:1.0;
21 R exp(y*log(x));
22 }
23 if(y==-inf){ASSERT(-1>x,EVDOMAIN); R 0.0;}
24 if(y== inf){ASSERT(-1<x,EVDOMAIN); R 0.0;}
25 jt->jerr=EWIMAG;
26 R 0;
27 } /* x^y where x and y are real and x is non-negative */
28
29 #define POWXB(u,v) (v?u:1)
30 #define POWBX(u,v) (u?1.0:v<0?inf:!v)
31 #define POWII(u,v) intpow((D)u,v)
32 #define POWID(u,v) pospow((D)u,v)
33
34 APFX(powBI, D,B,I, POWBX )
35 APFX(powBD, D,B,D, POWBX )
36 APFX(powIB, I,I,B, POWXB )
37 APFX(powII, D,I,I, POWII )
38 APFX(powID, D,I,D, POWID )
39 APFX(powDB, D,D,B, POWXB )
40 APFX(powDI, D,D,I, intpow)
41 APFX(powDD, D,D,D, pospow)
42 APFX(powZZ, Z,Z,Z, zpow )
43
44 ANAN(cirZZ, Z,Z,Z, zcir )
45
46 static void jtcirx(J jt,I n,I k,D*z,D*y){D p,t;
47 NAN0;
48 switch(k){
49 default: ASSERTW(0,EWIMAG);
50 case 0: DO(n, t=*y++; ASSERTW( -1.0<=t&&t<=1.0, EWIMAG ); *z++=sqrt(1.0-t*t);); break;
51 case 1: DO(n, t=*y++; ASSERTW(-THMAX<t&&t<THMAX,EVLIMIT); *z++=sin(t);); break;
52 case 2: DO(n, t=*y++; ASSERTW(-THMAX<t&&t<THMAX,EVLIMIT); *z++=cos(t);); break;
53 case 3: DO(n, t=*y++; ASSERTW(-THMAX<t&&t<THMAX,EVLIMIT); *z++=tan(t);); break;
54 case 4: DO(n, t=*y++; *z++=t<-1e8?-t:1e8<t?t:sqrt(t*t+1.0);); break;
55 case 5: DO(n, t=*y++; *z++=t<-EMAX2?infm:EMAX2<t?inf:sinh(t);); break;
56 case 6: DO(n, t=*y++; *z++=t<-EMAX2|| EMAX2<t?inf:cosh(t);); break;
57 case 7: DO(n, t=*y++; *z++=t<-TMAX?-1:TMAX<t?1:tanh(t);); break;
58 case -1: DO(n, t=*y++; ASSERTW( -1.0<=t&&t<=1.0, EWIMAG ); *z++=asin(t);); break;
59 case -2: DO(n, t=*y++; ASSERTW( -1.0<=t&&t<=1.0, EWIMAG ); *z++=acos(t);); break;
60 case -3: DO(n, *z++=atan(*y++);); break;
61 case -4: DO(n, t=*y++; ASSERTW(t<=-1.0||1.0<=t, EWIMAG ); *z++=t<-1e8||1e8<t?t:t==-1?0:(t+1)*sqrt((t-1)/(t+1));); break;
62 case -5: p=log(2.0);
63 DO(n, t=*y++; *z++=1.0e8<t?p+log(t):-7.8e3>t?-(p+log(-t)):log(t+sqrt(t*t+1.0));); break;
64 case -6: p=log(2.0);
65 DO(n, t=*y++; ASSERTW( 1.0<=t, EWIMAG ); *z++=1.0e8<t?p+log(t):log(t+sqrt(t*t-1.0));); break;
66 case -7: DO(n, t=*y++; ASSERTW( -1.0<=t&&t<=1.0, EWIMAG ); *z++=0.5*log((1.0+t)/(1.0-t));); break;
67 case 9: DO(n, *z++=*y++;); break;
68 case 10: DO(n, t=*y++; *z++=ABS(t);); break;
69 case 11: DO(n, *z++=0.0;); break;
70 case 12: DO(n, *z++=0<=*y++?0.0:PI;); break;
71 }
72 NAN1V;
73 }
74
75 AHDR2(cirBD,D,B,D){ASSERTW(b&&1==m,EWIMAG); cirx(n,(I)*x,z,y);}
76 AHDR2(cirID,D,I,D){ASSERTW(b&&1==m,EWIMAG); cirx(n, *x,z,y);}
77
78 AHDR2(cirDD,D,D,D){I k=(I)jfloor(0.5+*x);
79 ASSERTW(k==*x,EVDOMAIN);
80 ASSERTW(b&&1==m,EWIMAG);
81 cirx(n,k,z,y);
82 }
83
84
85 F2(jtlogar2){A z;I t;
86 RZ(a&&w);
87 t=maxtype(AT(a),AT(w));
88 if(!(t&XNUM)||jt->xmode==XMEXACT){jt->xmode=XMEXACT; R divide(logar1(w),logar1(a));}
89 z=rank2ex(cvt(XNUM,a),cvt(XNUM,w),0L,0L,0L,jtxlog2a);
90 if(z)R z;
91 if(jt->jerr==EWIMAG||jt->jerr==EWIRR){RESETERR; jt->xmode=XMEXACT; R divide(logar1(w),logar1(a));}
92 R 0;
93 }
94
95 F2(jtroot){A z;I t;
96 RZ(a&&w);
97 t=maxtype(AT(a),AT(w));
98 if(!(t&XNUM))R expn2(cvt(t,w),recip(cvt(t,a)));
99 z=rank2ex(cvt(XNUM,a),cvt(XNUM,w),0L,0L,0L,jtxroota);
100 switch(jt->jerr){
101 case EWIMAG: RESETERR; R expn2(cvt(CMPX,w),recip(cvt(CMPX,a)));
102 case EWIRR: RESETERR; R expn2(cvt(FL, w),recip(cvt(FL, a)));
103 default: R z;
104 }}
105
106 F1(jtjdot1){R tymes(a0j1,w);}
107 F2(jtjdot2){R plus(a,tymes(a0j1,w));}
108 F1(jtrdot1){R expn1(jdot1(w));}
109 F2(jtrdot2){R tymes(a,rdot1(w));}
110
111
112 F1(jtpolar){RZ(w); R cvt(SPARSE&AT(w)?SFL:FL,df2(v2(10L,12L),w,qq(ds(CCIRCLE),v2(1L,0L))));}
113
114 F1(jtrect){A e,z;B b;I r,t;P*wp,*zp;Z c;
115 RZ(w);
116 t=AT(w); r=AR(w); jt->rank=0;
117 ASSERT(!AN(w)||t&NUMERIC,EVDOMAIN);
118 if(t&CMPX){GA(z,FL,2*AN(w),1+r,AS(w)); *(AS(z)+r)=2; MC(AV(z),AV(w),AN(z)*sizeof(D)); R z;}
119 else if(t&SPARSE){
120 b=1&&t&SCMPX;
121 GA(z,b?SFL:t,1,1+r,AS(w)); *(AS(z)+r)=2;
122 wp=PAV(w); zp=PAV(z);
123 if(b){e=SPA(wp,e); c=*ZAV(e); ASSERT(FEQ(c.re,c.im),EVSPARSE); SPB(zp,e,scf(c.re));}
124 else SPB(zp,e,ca(SPA(wp,e)));
125 SPB(zp,a,ca(SPA(wp,a)));
126 SPB(zp,i,ca(SPA(wp,i)));
127 SPB(zp,x,rect(SPA(wp,x)));
128 R z;
129 }else R df2(w,zero,qq(ds(CCOMMA),zero));
130 }