final double /*@Real*/ forwardSk = Sk * dividendDiscount / riskFreeDiscount;
final double /*@Real*/ d1 = (Math.log(forwardSk/payoff.strike()) + 0.5*variance)/Math.sqrt(variance);
final double /*@Real*/ n = 2.0*Math.log(dividendDiscount/riskFreeDiscount)/variance;
final double /*@Real*/ K = -2.0*Math.log(riskFreeDiscount)/(variance*(1.0-riskFreeDiscount));
double /*@Real*/ Q, a;
switch (payoff.optionType()) {
case Call:
Q = (-(n-1.0) + Math.sqrt(((n-1.0)*(n-1.0))+4.0*K))/2.0;
a = (Sk/Q) * (1.0 - dividendDiscount * cumNormalDist.op(d1));
if (spot<Sk)
r.value = black.value() + a * Math.pow((spot/Sk), Q);