static double spmapprox(int ind, double spot, double strk, double ti, double ri, double dividi, double sigma0,double ka,double theta,double sigma2,double rhow, double alpha) { double logk; double uu, ww, deriv2, deriv3,prob, addterm; logk = log(strk); // s-p for K uu= alpha-ind+1.; if(uu==0.) { deriv2 = secderiv(1, spot, strk, ti, ri, dividi, sigma0, ka, theta, sigma2, rhow, alpha); deriv3 = thirdderiv(1, spot, strk, ti, ri, dividi, sigma0, ka, theta, sigma2, rhow, alpha); prob = 0.5 - deriv3/( 6.*deriv2*sqrt(2.*M_PI*deriv2) ); return prob; } // s-p for Ko ww= 2.0*(uu*logk - mgf(ind, spot, strk, ti, ri, dividi, sigma0, ka, theta, sigma2, rhow, alpha)); if(ww>0.) { ww = sqrt( ww );} else { printf("ww<0!\n"); ww= 1.; } if(uu<0.){ww *= -1.;} //sec deriv deriv2 = secderiv(1, spot, strk, ti, ri, dividi, sigma0, ka, theta, sigma2, rhow, alpha); deriv3 = thirdderiv(1, spot, strk, ti, ri, dividi, sigma0, ka, theta, sigma2, rhow, alpha); //deriv4 = fourthderiv(1, spot, strk, ti, ri, dividi, sigma0, ka, theta, sigma2, rhow, alpha); // probability approx Luganini-Rice formula if(deriv2>0.) { //znam = uu*sqrt(deriv2); addterm = 0.;//(deriv4/(deriv2*deriv2)/8. - 5.*deriv3*deriv3/(deriv2*deriv2*deriv2)/24.)/znam - deriv3/(deriv2*sqrt(deriv2))/4./(znam*znam) - 1./(znam*znam*znam) + 1./(ww*ww*ww) ; prob = 1. - cdf_nor(ww) + pnl_normal_density(ww)*( 1.0/(uu*sqrt(deriv2)) - 1.0/ww + addterm); } else {printf("deriv2<0!\n"); prob=0.;} return prob; }
/** * returns the 'index' function-name of the 'lib' */ int sblmgr_getfuncname(int lib_id, int index, char *buf) { #if defined(LNX_EXTLIB) || defined(WIN_EXTLIB) slib_t *lib; int (*mgf) (int, char *); buf[0] = '\0'; if (lib_id < 0 || lib_id >= slib_count) { return 0; } lib = &slib_table[lib_id]; mgf = slib_getoptptr(lib, "sblib_func_getname"); if (mgf == NULL) { return 0; } return mgf(index, buf); #else return 0; #endif }