// simu2.h  Stochastic Volatility Option Pricing Model

class svprice {
    svprice(double ttm=0.25,int nper=12,double r=.05,double initstd=.15,
      double meanstd=.2,double k=6.0,double sigstd=.5);
    Stochastic volatility means that volatility is a random process.  We
    have initstd, the initial standard deviation, meanstd, the long-term
    mean standard deviation, k, the mean reversion parameter for standard
    deviation, and sigstd, the volatility of the standard deviation.

    double eurcall(double stock,double strike,long int nsimu=1000);
    The data type ``long int'' has more precision (digits) than the data type
    ``int.''  100,000 is larger than the largest int on some machines.

    int npers;
    double tinc, r1per, stockP, sigma0, sigma, meansigma, sigmasigma, kappa,
      c0, c1, c2, c3, c4, c5;
    As usual the parameters are stored here.  The ci's are products etc. of
    the other parameters.  If they weren't stored separately, the would have
    to be computed again for every period of every simulation, which would
    slow the program significantly.

    double stocktotret();};

// simu2test.cc Stochastic Volatility Option Pricing Test File
#include "simu2.h"

main() {
  long int i,nsimus;
  svprice sim2;
  for(nsimus=10;nsimus<=100000l;nsimus *= 10)
  This for loop has us multiplying by 10 each time and the test concerns
  the size of nsimus.  In 100000l, the last digit is the letter ``el'' not
  the number ``one,'' and this means that 100000 is a long int.

    cout << nsimus << " " <<
      floor(sim2.eurcall((double) 100.0,(double) 100.0,nsimus)*100.0+0.5)/100.0
      << endl;
      The floor, etc. rounds to two decimal places.  Floor itself rounds down
      to the nearest integer.  It is probably better to do this with the
      manipulator setprecision().

  cout << endl;
    cout << "100000 " << 
      floor(sim2.eurcall((double) 100.0,(double) 100.0,(long int) 100000l)*100.0+0.5)/100.0
      << endl;

// simu2.cc  Stochastic Volatility Option Pricing Model
#include "simu2.h"
#define unifrand() ((double) rand()/((double) RAND_MAX))
#define MAX(a,b) (((a) > (b)) ? (a) : (b))

svprice::svprice(double ttm,int nper,double r,double initstd, double
    meanstd, double k, double sigstd) {
  npers = nper;
  tinc = ttm/(double) nper;
  r1per = 1.0 + r*tinc;
  sigma0 = initstd;
  meansigma = meanstd;
  sigmasigma = sigstd;
  kappa = k;
  c0 = kappa * tinc * meansigma;
  c1 = 1.0 - kappa * tinc;
  c2 = 1.0 - sigmasigma * sqrt(tinc)*0.5*sqrt((double) 12);
  c3 = sigmasigma * sqrt(tinc) * sqrt((double) 12);
  c4 = sqrt(tinc)*sqrt((double) 12);}
  There is nothing really new in the constructor.  The constants are
  explained a bit below.

double svprice::eurcall(double stock,double strike,long int nsimu) {
  long int i,n;
  double x;