double BS::callFXOptionPrice() const{ double cdfn1 = normalCDF(d1); double cdfn2 = normalCDF(d2); return S*exp(-rf*(T-t))*cdfn1 - E*exp(-rd*(T-t))*cdfn2; }
double BS::putFXOptionPrice() const{ double cdfn1 = normalCDF(-d1); double cdfn2 = normalCDF(-d2); return E*exp(-rd*(T-t))*cdfn2 - S*exp(-rf*(T-t))*cdfn1; }
// Compute gamma cdf by a normal approximation static double gnorm(double a, double x) { double p, sx; if (x <= 0.0 || a <= 0.0) return 0.0; else { sx = sqrt(a) * 3.0 * (pow(x / a, 1.0 / 3.0) + 1.0 / (a * 9.0) - 1.0); return normalCDF(sx); } }
static double normalizer(const Param &a, const Param &b) { double p1 = a.p; double p2 = b.p; double u1 = a.u; double u2 = b.u; double s1 = a.s; double s2 = b.s; double sum = 0; for(int r1=-6; r1 <=6; r1++) { for(int r2=-6; r2 <=6; r2++) { double u1_n = u1+r1*2*PI; double u2_n = u2+r2*2*PI; double top = exp(-0.5*((u1_n-u2_n)*(u1_n-u2_n))/(s1*s1+s2*s2)); double bot = sqrt(2*PI*(s1*s1+s2*s2)); double u_new = (u1_n*s2*s2+u2_n*s1*s1)/(s2*s2+s1*s1); double s_new = (s1*s2)/sqrt(s1*s1+s2*s2); sum += (top/bot) * (normalCDF(PI,u_new,s_new)-normalCDF(-PI,u_new,s_new)); } } return p1*p2*sum; }
/** * @brief Normal cumulative distribution function: In-database interface */ AnyType normal_cdf::run(AnyType &args) { return normalCDF(args[0].getAs<double>()); }