diff options
Diffstat (limited to 'mat')
-rw-r--r-- | mat/programčki/ničle.singlethreaded16bit.c | 37 |
1 files changed, 21 insertions, 16 deletions
diff --git a/mat/programčki/ničle.singlethreaded16bit.c b/mat/programčki/ničle.singlethreaded16bit.c index 2412a1a..49d53a6 100644 --- a/mat/programčki/ničle.singlethreaded16bit.c +++ b/mat/programčki/ničle.singlethreaded16bit.c @@ -8,8 +8,8 @@ #include <string.h> #include <unistd.h> #include <gsl/gsl_errno.h> -void pripravi_koeficiente (double * izhod, int številka) { - while (številka) { +void pripravi_koeficiente (double * izhod, int številka, int koeficientov) { + while (koeficientov--) { *izhod++ = številka & 1 ? 1 : -1; številka >>= 1; } @@ -21,7 +21,7 @@ int main (int argc, char ** argv) { fprintf(stderr, "uporaba: %s stopnja ime širina\n", argv[0] ? argv[0] : "ničle"); return 1; } - int šir = atoi(argv[3]); + long long int šir = atoi(argv[3]); int fd; if ((fd = open(argv[2], O_CREAT | O_RDWR, 00664)) == -1) { perror("open"); @@ -42,19 +42,20 @@ int main (int argc, char ** argv) { } unsigned char * slika = (unsigned char *) p + 128; memset(p, 0, 128 + šir*šir*2); - sprintf(p, "P5\n\n%58d\n%58d\n65535\n", šir, šir); // precisely calculated with dc(1) (: - int stopnja = atoi(argv[1]); - double koeficienti[stopnja+1]; // kako prikladno! polinom nte stopnje ima n+1 členov - double ničle[2*stopnja]; // ima pa n ničer, 2n+0 so realni deli, 2n+1 pa imaginarni + sprintf(p, "P5\n\n%58lld\n%58lld\n65535\n", šir, šir); // precisely calculated with dc(1) (: + long long int stopnja = atoi(argv[1]); + double koeficienti[stopnja+1]; // kako prikladno! polinom nte stopnje ima n+1 členov + double ničle[2*stopnja]; // ima pa n ničel, 2n so realni deli, 2n+1 pa imagin gsl_set_error_handler_off(); gsl_poly_complex_workspace * w = gsl_poly_complex_workspace_alloc(stopnja+1); int prej_izpisano = 6969; - for (int i = 0; i < 1 << (stopnja+1); i++) { - if (prej_izpisano != i*1000/(1 << (stopnja+1))) { - prej_izpisano = i*1000/(1 << (stopnja+1)); + unsigned int over = 0; + for (long long int i = 0; i < 1LL << (stopnja+1); i++) { + if (prej_izpisano != i*1000/(1LL << (stopnja+1))) { + prej_izpisano = i*1000/(1LL << (stopnja+1)); fprintf(stderr, "\rRačunam in rišem ničle: %d promilov", prej_izpisano); - } - pripravi_koeficiente(koeficienti, i); // noben člen ni 0, vsi so bodisi 1 bodisi -1 + } // noben člen ni 0, vsi so bodisi 1 bodisi -1 + pripravi_koeficiente(koeficienti, i, stopnja+1); if (gsl_poly_complex_solve(koeficienti, stopnja+1, w, ničle) != GSL_SUCCESS) nekonvergiranih++; // uuu, lahko bi recimo narisali tiste, ki ne konver. for (int j = 0; j < 2*stopnja; j += 2) { @@ -66,8 +67,12 @@ int main (int argc, char ** argv) { continue; } slika[2*šir*višina_na_sliki+širina_na_sliki*2+1]++; - if (!slika[1*šir*višina_na_sliki+širina_na_sliki*2+1]) - slika[2*šir*višina_na_sliki+širina_na_sliki*2]++; + if (!slika[2*šir*višina_na_sliki+širina_na_sliki*2+1]) { + if (slika[2*šir*višina_na_sliki+širina_na_sliki*2] != 255) + slika[2*šir*višina_na_sliki+širina_na_sliki*2]++; + else + over++; + } } } fprintf(stderr, "\r KONČANO \n"); @@ -76,7 +81,7 @@ int main (int argc, char ** argv) { perror("munmap"); // nima smisla ukinjat programa, sistem si je sam kriv >:) if (close(fd) == -1) perror("close"); - printf("%d ničel je izven 2+2i (izven slike)\n%d polinomov ni konvergiralo\n", - izven_slike, nekonvergiranih); + printf("%u ničel je izven 2+2i (izven slike)\n%u polinomov ni konvergiralo\n" + "%d overflowov na sliki\n", izven_slike, nekonvergiranih, over); return 0; } |