docs: public static double bachelierOptionImpliedVolatility(
  			double forward,
  			double optionMaturity,
  			double optionStrike,
  			double payoffUnit,
  			double optionValue)
  	{
  		if(forward == optionStrike) {
  			return optionValue / Math.sqrt(optionMaturity / Math.PI / 2.0) / payoffUnit;
  		}
  
  		// Limit the maximum number of iterations, to ensure this calculation returns fast, e.g. in cases when there is no such thing as an implied vol
  		// TODO: An exception should be thrown, when there is no implied volatility for the given value.
  		int		maxIterations	= 100;
  		double	maxAccuracy		= 0.0;
  
  		// Calculate an lower and upper bound for the volatility
  		double volatilityLowerBound = 0.0;
  		double volatilityUpperBound = Math.sqrt(2 * Math.PI * Math.E) * (optionValue / payoffUnit + Math.abs(forward-optionStrike)) / Math.sqrt(optionMaturity);
  
  		// Solve for implied volatility
  		GoldenSectionSearch solver = new GoldenSectionSearch(volatilityLowerBound, volatilityUpperBound);
  		while(solver.getAccuracy() > maxAccuracy && !solver.isDone() && solver.getNumberOfIterations() < maxIterations) {
  			double volatility = solver.getNextPoint();
  
  			double valueAnalytic	= bachelierOptionValue(forward, volatility, optionMaturity, optionStrike, payoffUnit);
  
  			double error = valueAnalytic - optionValue;
  
  			solver.setValue(error*error);
  		}
  
  		return solver.getBestPoint();
  	}