Mercurial > hg > jgplsrc
view va1.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 (2013-11-25) |
parents | |
children |
line wrap: on
line source
/* Copyright 1990-2011, Jsoftware Inc. All rights reserved. */ /* License in license.txt. */ /* */ /* Verbs: Monadic Atomic */ #include "j.h" #include "ve.h" static AMON(floorDI,I,D, {D d=tfloor(*x); *z=(I)d; ASSERTW(d==*z,EWOV);}) static AMON(floorD, D,D, *z=tfloor(*x);) static AMON(floorZ, Z,Z, *z=zfloor(*x);) static AMON(ceilDI, I,D, {D d=tceil(*x); *z=(I)d; ASSERTW(d==*z,EWOV);}) static AMON(ceilD, D,D, *z=tceil(*x);) static AMON(ceilZ, Z,Z, *z=zceil(*x);) static AMON(cjugZ, Z,Z, *z=zconjug(*x);) static AMON(sgnI, I,I, *z=SGN(*x);) static AMON(sgnD, I,D, *z=jt->ct>ABS(*x)?0:SGN(*x);) static AMON(sgnZ, Z,Z, if(jt->ct>zmag(*x))*z=zeroZ; else *z=ztrend(*x);) static AMON(sqrtI, D,I, ASSERTW(0<=*x,EWIMAG); *z=sqrt((D)*x);) static AMON(sqrtD, D,D, ASSERTW(0<=*x,EWIMAG); *z=sqrt( *x);) static AMON(sqrtZ, Z,Z, *z=zsqrt(*x);) static AMON(expB, D,B, *z=*x?2.71828182845904523536:1;) static AMON(expI, D,I, *z=*x<EMIN?0.0:EMAX<*x?inf:exp((D)*x);) static AMON(expD, D,D, *z=*x<EMIN?0.0:EMAX<*x?inf:exp( *x);) static AMON(expZ, Z,Z, *z=zexp(*x);) static AMON(logB, D,B, *z=*x?0:infm;) static AMON(logI, D,I, ASSERTW(0<=*x,EWIMAG); *z=log((D)*x);) static AMON(logD, D,D, ASSERTW(0<=*x,EWIMAG); *z=log( *x);) static AMON(logZ, Z,Z, *z=zlog(*x);) static AMON(absI, I,I, if(0<=*x)*z=*x; else{ASSERTW(IMIN<*x,EWOV); *z=-*x;}) static AMON(absD, D,D, *z= ABS(*x);) static AMON(absZ, D,Z, *z=zmag(*x);) static AHDR1(oneB,C,C){memset(z,C1,n);} static AHDR1(idf ,C,C){} /* dummy */ static UC va1fns[]={CFLOOR, CCEIL, CPLUS, CSTAR, CSQRT, CEXP, CLOG, CSTILE, CBANG, CCIRCLE, C0}; static UA va1tab[]={ /* <. */ {{{ idf,VB}, { idf,VI}, {floorDI,VI}, {floorZ,VZ}, { idf,VX}, {floorQ,VX}}}, /* >. */ {{{ idf,VB}, { idf,VI}, { ceilDI,VI}, { ceilZ,VZ}, { idf,VX}, { ceilQ,VX}}}, /* + */ {{{ idf,VB}, { idf,VI}, { idf,VD}, { cjugZ,VZ}, { idf,VX}, { idf,VQ}}}, /* * */ {{{ idf,VB}, { sgnI,VI}, { sgnD,VI}, { sgnZ,VZ}, { sgnX,VX}, { sgnQ,VX}}}, /* %: */ {{{ idf,VB}, {sqrtI,VD}, { sqrtD,VD}, { sqrtZ,VZ}, {sqrtX,VX}, { sqrtQ,VQ}}}, /* ^ */ {{{expB,VD}, { expI,VD}, { expD,VD}, { expZ,VZ}, { expX,VX}, { expD,VD+VDD}}}, /* ^. */ {{{logB,VD}, { logI,VD}, { logD,VD}, { logZ,VZ}, { logX,VX}, { logQD,VD}}}, /* | */ {{{ idf,VB}, { absI,VI}, { absD,VD}, { absZ,VD}, { absX,VX}, { absQ,VQ}}}, /* ! */ {{{oneB,VB}, {factI,VD}, { factD,VD}, { factZ,VZ}, {factX,VX}, { factQ,VX}}}, /* o. */ {{{ 0L,0L}, { 0L,0L}, { 0L,0L}, { 0L,0L}, { pixX,VX}, { 0L,0L}}} }; static A jtva1(J,A,C); static A jtva1s(J jt,A w,C id,I cv,VF ado){A e,x,z,ze,zx;B c;C ee;I n,t,zt;P*wp,*zp; t=atype(cv); zt=rtype(cv); wp=PAV(w); e=SPA(wp,e); x=SPA(wp,x); c=t&&t!=AT(e); if(c)RZ(e=cvt(t,e)); GA(ze,zt,1,0, 0 ); ado(jt,1L,AV(ze),AV(e)); if(c)RZ(e=cvt(t,x)); n=AN(x); GA(zx,zt,n,AR(x),AS(x)); ado(jt,n, AV(zx),AV(x)); if(jt->jerr){ if(jt->jerr<=NEVM)R 0; ee=jt->jerr; RZ(ze=va1(e,id)); jt->jerr=ee; RZ(zx=va1(x,id)); }else if(cv&VRI+VRD){RZ(ze=cvz(cv,ze)); RZ(zx=cvz(cv,zx));} GA(z,STYPE(AT(ze)),1,AR(w),AS(w)); zp=PAV(z); SPB(zp,a,ca(SPA(wp,a))); SPB(zp,i,ca(SPA(wp,i))); SPB(zp,e,ze); SPB(zp,x,zx); R z; } #define VA1CASE(e,f) (256*(e)+(f)) static A jtva1(J jt,A w,C id){A e,z;B b,m;I cv,n,t,wt,zt;P*wp;VA2 p;VF ado; RZ(w); n=AN(w); wt=n?AT(w):B01; ASSERT(wt&NUMERIC,EVDOMAIN); if(b=1&&wt&SPARSE){wp=PAV(w); e=SPA(wp,e); wt=AT(e);} if(jt->jerr){ m=!(wt&XNUM+RAT); switch(VA1CASE(jt->jerr,id)){ default: R 0; case VA1CASE(EWOV, CFLOOR): cv=VD; ado=floorD; break; case VA1CASE(EWOV, CCEIL ): cv=VD; ado=ceilD; break; case VA1CASE(EWOV, CSTILE): cv=VD+VDD; ado=absD; break; case VA1CASE(EWIRR, CSQRT ): cv=VD+VDD; ado=sqrtD; break; case VA1CASE(EWIRR, CEXP ): cv=VD+VDD; ado=expD; break; case VA1CASE(EWIRR, CBANG ): cv=VD+VDD; ado=factD; break; case VA1CASE(EWIRR, CLOG ): cv=VD+VDD*m; ado=m?(VF)logD:(VF)logXD; break; case VA1CASE(EWIMAG,CSQRT ): cv=VZ+VZZ; ado=sqrtZ; break; case VA1CASE(EWIMAG,CLOG ): cv=VZ+VZZ*m; ado=m?(VF)logZ:wt&XNUM?(VF)logXZ:(VF)logQZ; } RESETERR; }else{ p=((va1tab+(strchr(va1fns,id)-(C*)va1fns))->p1)[wt&B01?0:wt&INT?1:wt&FL?2:wt&CMPX?3:wt&XNUM?4:5]; ado=p.f; cv=p.cv; } if(ado==idf)R rat(w); if(b)R va1s(w,id,cv,ado); t=atype(cv); zt=rtype(cv); if(t&&t!=wt)RZ(w=cvt(t,w)); GA(z,zt,n,AR(w),AS(w)); ado(jt,n,AV(z),AV(w)); if(jt->jerr)R NEVM<jt->jerr?va1(w,id):0; else R cv&VRI+VRD?cvz(cv,z):z; } F1(jtfloor1){R va1(w,CFLOOR);} F1(jtceil1 ){R va1(w,CCEIL );} F1(jtconjug){R va1(w,CPLUS );} F1(jtsignum){R va1(w,CSTAR );} F1(jtsqroot){R va1(w,CSQRT );} F1(jtexpn1 ){R va1(w,CEXP );} F1(jtlogar1){R va1(w,CLOG );} F1(jtmag ){R va1(w,CSTILE);} F1(jtfact ){R va1(w,CBANG );} F1(jtpix ){RZ(w); R XNUM&AT(w)&&(jt->xmode==XMFLR||jt->xmode==XMCEIL)?va1(w,CCIRCLE):tymes(pie,w);}