docs: public static double blackScholesGeneralizedOptionValue(
  			double forward,
  			double volatility,
  			double optionMaturity,
  			double optionStrike,
  			double payoffUnit)
  	{
  		if(optionMaturity < 0) {
  			return 0;
  		}
  		else if(forward < 0) {
  			// We use max(X,0) = X + max(-X,0)
  			return (forward - optionStrike) * payoffUnit + blackScholesGeneralizedOptionValue(-forward, volatility, optionMaturity, -optionStrike, payoffUnit);
  		}
  		else if((forward == 0) || (optionStrike <= 0.0) || (volatility <= 0.0) || (optionMaturity <= 0.0))
  		{
  			// Limit case (where dPlus = +/- infty)
  			return Math.max(forward - optionStrike,0) * payoffUnit;
  		}
  		else
  		{
  			// Calculate analytic value
  			double dPlus = (Math.log(forward / optionStrike) + 0.5 * volatility * volatility * optionMaturity) / (volatility * Math.sqrt(optionMaturity));
  			double dMinus = dPlus - volatility * Math.sqrt(optionMaturity);
  
  			double valueAnalytic = (forward * NormalDistribution.cumulativeDistribution(dPlus) - optionStrike * NormalDistribution.cumulativeDistribution(dMinus)) * payoffUnit;
  
  			return valueAnalytic;
  		}
  	}