Main.c 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. #include <math.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. typedef long double Number;
  5. static Number circle(Number x) {
  6. return sqrtl(1.0 - x * x);
  7. }
  8. static Number monteCarloIntegration(void) {
  9. int amount = 512 * 512;
  10. int in = 0;
  11. for(int i = 0; i < amount; i++) {
  12. Number x = rand() / (Number)RAND_MAX;
  13. Number y = rand() / (Number)RAND_MAX;
  14. in += (x * x + y * y < 1);
  15. }
  16. return 4.0 * in / amount;
  17. }
  18. static Number simpson(Number a, Number b) {
  19. return ((b - a) / 6.0) *
  20. (circle(a) + 4.0 * circle((a + b) * 0.5) + circle(b));
  21. }
  22. static Number simpsonIntegration(void) {
  23. Number sum = 0.0;
  24. for(int i = 0; i < 100; i++) {
  25. sum += simpson(i / 100.0, (i + 1) / 100.0);
  26. }
  27. return 4.0 * sum;
  28. }
  29. static Number lineSum(void) {
  30. Number sum = 0.0;
  31. const int max = 1000000;
  32. for(int i = 0; i < max; i++) {
  33. Number x1 = (Number)i / max;
  34. Number x2 = (i + 1.0) / max;
  35. Number diffX = x2 - x1;
  36. Number diffY = circle(x2) - circle(x1);
  37. sum += sqrtl(diffX * diffX + diffY * diffY);
  38. }
  39. return sum * 2.0;
  40. }
  41. static Number lineRecursion(void) {
  42. Number x1 = 0.0;
  43. Number y1 = 1.0;
  44. Number x2 = 1.0;
  45. Number y2 = 0.0;
  46. Number factor = 2.0;
  47. for(int i = 0; i < 26; i++) {
  48. Number midX = (x1 + x2) * 0.5;
  49. Number midY = (y1 + y2) * 0.5;
  50. Number length = sqrtl(midX * midX + midY * midY);
  51. midX /= length;
  52. midY /= length;
  53. x2 = midX;
  54. y2 = midY;
  55. factor *= 2;
  56. }
  57. Number diffX = x2 - x1;
  58. Number diffY = y2 - y1;
  59. return sqrtl(diffX * diffX + diffY * diffY) * factor;
  60. }
  61. static void print(Number d) {
  62. Number diff = d - M_PI;
  63. printf("%.20Lf %.20Lf\n", d, diff < 0.0 ? -diff : diff);
  64. }
  65. #define STR(x) STR2(x)
  66. #define STR2(x) #x
  67. int main(void) {
  68. print(monteCarloIntegration());
  69. print(simpsonIntegration());
  70. print(lineSum());
  71. print((double)lineRecursion());
  72. puts(STR(M_PI));
  73. return 0;
  74. }