dmax.c 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4. #include "local_proto.h"
  5. double *Cdhc_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. fprintf(stderr, "Memory error in Cdhc_dmax\n");
  13. exit(EXIT_FAILURE);
  14. }
  15. sqrt2 = sqrt((double)2.0);
  16. sqrtn = sqrt((double)n);
  17. for (i = 0; i < n; ++i) {
  18. xcopy[i] = x[i];
  19. mean += x[i];
  20. sdx += x[i] * x[i];
  21. }
  22. sdx = sqrt((n * sdx - mean * mean) / (n * (n - 1.0)));
  23. mean /= n;
  24. qsort(xcopy, n, sizeof(double), Cdhc_dcmp);
  25. for (i = 0; i < n; ++i) {
  26. xcopy[i] = (xcopy[i] - mean) / sdx;
  27. fx = 0.5 + Cdhc_normp(xcopy[i] / sqrt2) / 2.0;
  28. if (fx <= 1e-5)
  29. fx = 1e-5;
  30. if (fx >= 0.99999)
  31. fx = 0.99999;
  32. dp = (double)(i + 1) / (double)n - fx;
  33. dm = fx - i / (double)n;
  34. if (i == 0 || dp > dp_max)
  35. dp_max = dp;
  36. if (i == 0 || dm > dm_max)
  37. dm_max = dm;
  38. }
  39. y[0] = dp_max;
  40. y[1] = dm_max;
  41. free(xcopy);
  42. return y;
  43. }