Forráskód Böngészése

Add warnings and fixes, use lib sqrt

Kajetan Johannes Hammerle 10 hónapja
szülő
commit
ba20fa4e5c
2 módosított fájl, 112 hozzáadás és 49 törlés
  1. 41 47
      .gitignore
  2. 71 2
      Makefile

+ 41 - 47
.gitignore

@@ -2,89 +2,83 @@
 #include <stdio.h>
 #include <stdlib.h>
 
-double root(double x, int steps) {
-    if(x == 0.0) {
-        return 0.0;
-    }
-    double a = x;
-    x /= 2;
-    for(int i = 0; i < steps; i++) {
-        x = (x + a / x) * 0.5;
-    }
-    return x;
-}
+typedef long double Number;
 
-double circle(double x) {
-    return root(1 - x * x, 25);
+static Number circle(Number x) {
+    return sqrtl(1.0 - x * x);
 }
 
-double monteCarloIntegration() {
+static Number monteCarloIntegration(void) {
     int amount = 512 * 512;
     int in = 0;
     for(int i = 0; i < amount; i++) {
-        double x = rand() / (double)RAND_MAX;
-        double y = rand() / (double)RAND_MAX;
+        Number x = rand() / (Number)RAND_MAX;
+        Number y = rand() / (Number)RAND_MAX;
         in += (x * x + y * y < 1);
     }
     return 4.0 * in / amount;
 }
 
-double simpson(double a, double b) {
-    return ((b - a) / 6.0) * (circle(a) + 4 * circle((a + b) * 0.5) + circle(b));
+static Number simpson(Number a, Number b) {
+    return ((b - a) / 6.0) *
+           (circle(a) + 4.0 * circle((a + b) * 0.5) + circle(b));
 }
 
-double simpsonIntegration() {
-    double sum = 0.0;
+static Number simpsonIntegration(void) {
+    Number sum = 0.0;
     for(int i = 0; i < 100; i++) {
         sum += simpson(i / 100.0, (i + 1) / 100.0);
     }
     return 4.0 * sum;
 }
 
-double lineSum() {
-    double sum = 0.0;
+static Number lineSum(void) {
+    Number sum = 0.0;
     const int max = 1000000;
     for(int i = 0; i < max; i++) {
-        double x1 = (double)i / max;
-        double x2 = (i + 1.0) / max;
-        double diffX = x2 - x1;
-        double diffY = circle(x2) - circle(x1);
-        sum += root(diffX * diffX + diffY * diffY, 30);
+        Number x1 = (Number)i / max;
+        Number x2 = (i + 1.0) / max;
+        Number diffX = x2 - x1;
+        Number diffY = circle(x2) - circle(x1);
+        sum += sqrtl(diffX * diffX + diffY * diffY);
     }
     return sum * 2.0;
 }
 
-double lineRecursion() {
-    double x1 = 0.0;
-    double y1 = 1.0;
-    double x2 = 1.0;
-    double y2 = 0.0;
-    double factor = 2.0;
-    for(int i = 0; i < 24; i++) {
-        double midX = (x1 + x2) * 0.5;
-        double midY = (y1 + y2) * 0.5;
-        double length = root(midX * midX + midY * midY, 10);
+static Number lineRecursion(void) {
+    Number x1 = 0.0;
+    Number y1 = 1.0;
+    Number x2 = 1.0;
+    Number y2 = 0.0;
+    Number factor = 2.0;
+    for(int i = 0; i < 26; i++) {
+        Number midX = (x1 + x2) * 0.5;
+        Number midY = (y1 + y2) * 0.5;
+        Number length = sqrtl(midX * midX + midY * midY);
         midX /= length;
         midY /= length;
         x2 = midX;
         y2 = midY;
         factor *= 2;
     }
-    double diffX = x2 - x1;
-    double diffY = y2 - y1;
-    return root(diffX * diffX + diffY * diffY, 200) * factor;
+    Number diffX = x2 - x1;
+    Number diffY = y2 - y1;
+    return sqrtl(diffX * diffX + diffY * diffY) * factor;
 }
 
-void print(double d) {
-    double diff = d - M_PI;
-    printf("%.20lf %.20lf\n", d, diff < 0.0 ? -diff : diff);
+static void print(Number d) {
+    Number diff = d - M_PI;
+    printf("%.20Lf %.20Lf\n", d, diff < 0.0 ? -diff : diff);
 }
 
-int main() {
+#define STR(x) STR2(x)
+#define STR2(x) #x
+
+int main(void) {
     print(monteCarloIntegration());
     print(simpsonIntegration());
     print(lineSum());
-    print(lineRecursion());
-    puts("3.14159265358979323846\n");
+    print((double)lineRecursion());
+    puts(STR(M_PI));
     return 0;
-}
+}

+ 71 - 2
Makefile

@@ -1,7 +1,76 @@
 all: pi
 	
 pi: Main.c
-	gcc -o $@ Main.c -Wall -Wextra -Werror -pedantic -O3
+	gcc -o $@ Main.c -lm -O3 \
+		-Wall \
+		-Walloc-zero \
+		-Walloca \
+		-Wanalyzer-too-complex \
+		-Warith-conversion \
+		-Warray-bounds=2 \
+		-Warray-parameter \
+		-Wattribute-alias=2 \
+		-Wbad-function-cast \
+		-Wbidi-chars=any \
+		-Wcast-align=strict \
+		-Wcast-qual \
+		-Wconversion \
+		-Wdate-time \
+		-Wdisabled-optimization \
+		-Wdouble-promotion \
+		-Wduplicated-branches \
+		-Wduplicated-cond \
+		-Wenum-compare \
+		-Wenum-conversion \
+		-Werror \
+		-Wextra \
+		-Wfloat-equal \
+		-Wformat-overflow=2 \
+		-Wformat-signedness \
+		-Wformat-truncation=2 \
+		-Wformat=2 \
+		-Wframe-larger-than=8388608 \
+		-Wimplicit-fallthrough=5 \
+		-Winfinite-recursion \
+		-Winit-self \
+		-Winvalid-pch \
+		-Wjump-misses-init \
+		-Wlarger-than=1073741824 \
+		-Wlogical-op \
+		-Wmissing-braces \
+		-Wmissing-declarations \
+		-Wmissing-include-dirs \
+		-Wmissing-prototypes \
+		-Wmultichar \
+		-Wnarrowing \
+		-Wnested-externs \
+		-Wnormalized=nfkc \
+		-Wnull-dereference \
+		-Wold-style-definition \
+		-Woverlength-strings \
+		-Wredundant-decls \
+		-Wshadow \
+		-Wshift-overflow=2 \
+		-Wsign-conversion \
+		-Wstack-protector \
+		-Wstack-usage=8388608 \
+		-Wstrict-overflow=2 \
+		-Wstrict-prototypes \
+		-Wstringop-overflow=4 \
+		-Wswitch-enum \
+		-Wtrampolines \
+		-Wtrivial-auto-var-init \
+		-Wundef \
+		-Wunreachable-code \
+		-Wunused-const-variable=2 \
+		-Wuse-after-free=3 \
+		-Wvla \
+		-Wwrite-strings \
+		-pedantic \
+		-pedantic-errors
+
+run: pi
+	./pi
 	
 clean:
-	rm -f pi
+	rm -f pi