dmax.c 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4. #include "local_proto.h"
  5. double *dmax (double *x, int n)
  6. {
  7. static double y[2];
  8. double *xcopy, sqrt2, sqrtn, mean = 0.0, sdx = 0.0, fx;
  9. double dp, dp_max, dm, dm_max;
  10. int i;
  11. if ((xcopy = (double *) malloc (n * sizeof (double))) == NULL)
  12. {
  13. fprintf (stderr, "Memory error in dmax\n");
  14. exit(EXIT_FAILURE);
  15. }
  16. sqrt2 = sqrt ((double) 2.0);
  17. sqrtn = sqrt ((double) n);
  18. for (i = 0; i < n; ++i)
  19. {
  20. xcopy[i] = x[i];
  21. mean += x[i];
  22. sdx += x[i] * x[i];
  23. }
  24. sdx = sqrt ((n * sdx - mean * mean) / (n * (n - 1.0)));
  25. mean /= n;
  26. qsort (xcopy, n, sizeof (double), dcmp);
  27. for (i = 0; i < n; ++i)
  28. {
  29. xcopy[i] = (xcopy[i] - mean) / sdx;
  30. fx = 0.5 + normp (xcopy[i] / sqrt2) / 2.0;
  31. if (fx <= 1e-5)
  32. fx = 1e-5;
  33. if (fx >= 0.99999)
  34. fx = 0.99999;
  35. dp = (double) (i + 1) / (double) n - fx;
  36. dm = fx - i / (double) n;
  37. if (i == 0 || dp > dp_max)
  38. dp_max = dp;
  39. if (i == 0 || dm > dm_max)
  40. dm_max = dm;
  41. }
  42. y[0] = dp_max;
  43. y[1] = dm_max;
  44. free (xcopy);
  45. return y;
  46. }