summaryrefslogtreecommitdiffstats
path: root/mat
diff options
context:
space:
mode:
Diffstat (limited to 'mat')
-rw-r--r--mat/programčki/ničle.singlethreaded16bit.c37
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;
}