#include "xlisp.h" extern LVAL cvflonum(); float logistic (x) float x; { double exp (); #ifdef MSDOS if (x > 11.5129) return(.99999); else if (x < -11.5129) return(.00001); #else if (x > 15.935773) return(.99999988); else if (x < -15.935773) return(.00000012); #endif else return(1.0/ (1.0+ (float)exp((double)((-1.0)*x)))); } float getflt(arg) LVAL arg; { if (floatp(arg)) return (float) getflonum(arg); else if (fixp(arg)) return (float) getfixnum(arg); else xlbadtype(arg); } LVAL xlogistic() { LVAL arg1; FLOTYPE v; arg1 = xlgetarg(); xllastarg(); return(cvflonum((FLOTYPE) logistic(getflt(arg1)))); } LVAL xvdot() { LVAL arg1,arg2; float sum; int i; arg1 = xlgavector(); arg2 =xlgavector(); xllastarg(); sum = 0.0; for (i = 0; i< getsize(arg1); i++) sum += getflt(getelement(arg1,i)) * getflt(getelement(arg2,i)); return (cvflonum(sum)); }Xlispでは,ユーザが関数を増やす場合に2つのヘッダファイルosdefs.h, osptrs.hに その増やした関数を登録します.この二つは,xlftab.cの中でincludeされてい る.
{"LOGISTIC", S, xlogistic}, {"V.", S,xvdot},
extern LVAL xlogistic(); extern LVAL xvdot();