diff options
| author | Julian Weigt <juw@posteo.de> | 2026-01-16 19:05:23 +0100 |
|---|---|---|
| committer | Julian Weigt <juw@posteo.de> | 2026-02-04 15:55:54 +0100 |
| commit | 2d7d2f09189d57b47863d2ce89b6a450f4402681 (patch) | |
| tree | e8ac8b38fe3125631d4e6f1be0c068b4600a5b1e | |
| parent | eefbfcdfc2f2374dcba95a62c31f3162e2247853 (diff) | |
Finish all printing including latex and niceties for printing 0 and 1 and such.
| -rw-r--r-- | charf.c | 82 | ||||
| -rw-r--r-- | double-error.c | 30 | ||||
| -rw-r--r-- | double-error.h | 6 | ||||
| -rw-r--r-- | double.c | 16 | ||||
| -rw-r--r-- | double.h | 6 | ||||
| -rw-r--r-- | ratio.c | 23 | ||||
| -rw-r--r-- | ratio.h | 6 |
7 files changed, 142 insertions, 27 deletions
@@ -32,6 +32,8 @@ #define EXPTYPE double #endif +#define STRING_SIZE 65536 + /*maximum length of the support of f*/ #define N 24 @@ -162,16 +164,31 @@ int generate_function(VALUETYPE* f, int i){ //return generate_triangle(f,i); } -void format_result(char* s, int index, int k, EXPTYPE p, VALUETYPE r){ +#define FORMAT_TEXT 0 +#define FORMAT_LATEX 1 +void format_result(char* s, int index, int k, EXPTYPE p, VALUETYPE r, int format){ VALUETYPE f[N]; int d = generate_function(f,index); - sprintf(s,"f: "); - int l = 3; - for(int i=0; i<d; i++) l += sprintf(s+l,"%2.0f ",valuetype_to_double(f[i])); - for(int i=d; i<N; i++) l += sprintf(s+l," "); - char rts[128]; - root_to_string(rts,r,p); - l += sprintf(s+l,"|f^(%d)|_1/%2.1f: %s",k,inv_exptype_to_double(p),rts); + if(format == FORMAT_TEXT){ + strcpy(s,"f: "); + int l = 3; + for(int i=0; i<d; i++) l += sprintf(s+l,"%2.0f ",valuetype_to_double(f[i])); + for(int i=d; i<N; i++) l += sprintf(s+l," "); + char rts[128]; + root_to_string(rts,r,p); + l += sprintf(s+l,"|f^(%d)|_1/%2.1f: %s",k,inv_exptype_to_double(p),rts); + } + else if(format == FORMAT_LATEX){ + int l = 0; + char v[128]; + root_to_latex(v,r,p); + l += sprintf(s+l,"$%d$ & $\\frac1{%1.0f}$ & %s",k,inv_exptype_to_double(p),v); + for(int i=0; i<d; i++){ + valuetype_to_latex(v,f[i]); + l += sprintf(s+l,"& %s ",v); + } + for(int i=d; i<N; i++) l += sprintf(s+l,"& "); + } } bool over_threshold_charf(double t, int k){ @@ -237,7 +254,7 @@ int compute(int index, int num_exponents[K+1], EXPTYPE exponents[K+1][P], VALUET if(is_greater_certainly(r,(*records_ratio)[k][p])){ (*records_index)[k][p] = index; char s[1024]; - format_result(s, index, k, exponents[k][p], r); + format_result(s, index, k, exponents[k][p], r, FORMAT_TEXT); printf("%s\n",s); } (*records_ratio)[k][p] = maximum((*records_ratio)[k][p],r); @@ -247,13 +264,46 @@ int compute(int index, int num_exponents[K+1], EXPTYPE exponents[K+1][P], VALUET return D; } -void print_records(int num_exponents[K+1], EXPTYPE exponents[K+1][P], VALUETYPE ratios[K+1][P], int indeces[K+1][P]){ - char s[1024]; - printf("Current records:\n"); +void format_results(char* text, int num_exponents[K+1], EXPTYPE exponents[K+1][P], VALUETYPE ratios[K+1][P], int indeces[K+1][P], int format){ + char newline[4]; + if(format == FORMAT_TEXT) strcpy(newline,""); + else if(format == FORMAT_LATEX) strcpy(newline,"\\\\"); + + char s[STRING_SIZE]; + int l = 0; for(int k=0; k<=K; k++) for(int p=0; p<num_exponents[k]; p++){ - format_result(s, indeces[k][p], k, exponents[k][p], ratios[k][p]); - printf("%s\n",s); + format_result(s, indeces[k][p], k, exponents[k][p], ratios[k][p], format); + l += sprintf(text+l,"%s%s\n",s,newline); } + /*Remove last \\ and \n*/ + text[l-4] = '\0'; +} + +void print_records(int num_exponents[K+1], EXPTYPE exponents[K+1][P], VALUETYPE ratios[K+1][P], int indeces[K+1][P]){ + char s[STRING_SIZE]; + printf("Current records:\n"); + format_results(s, num_exponents, exponents, ratios, indeces, FORMAT_TEXT); + printf("%s\n",s); +} + +void print_latex_records_to_file(int num_exponents[K+1], EXPTYPE exponents[K+1][P], VALUETYPE ratios[K+1][P], int indeces[K+1][P], char* filename){ + char h[1024]; + strcpy(h,"{ccc"); + for(int n=0; n<N; n++) strcat(h,"c"); + strcat(h,"}"); + + char f[1024]; + strcpy(f,"$k$ & $p$ & $r$ & $f$ "); + for(int n=1; n<N; n++) strcat(f,"& "); + strcat(f,"\\\\\n\\hline"); + + char s[STRING_SIZE]; + format_results(s, num_exponents, exponents, ratios, indeces, FORMAT_LATEX); + + FILE *fptr; + fptr = fopen(filename, "w"); + fprintf(fptr, "\\begin{tabular}%s\n%s\n%s\n\\end{tabular}",h,f,s); + fclose(fptr); } typedef struct { int num_exponents[K+1]; EXPTYPE exponents[K+1][P]; VALUETYPE (*records_ratio)[K+1][P]; int (*records_index)[K+1][P]; int num_thread; int* domain_current; int* cont; } Args; @@ -316,6 +366,10 @@ int main() { exit(EXIT_SUCCESS); } else if( 0 == strcmp(buff,"r")) print_records(num_exponents,exponents,records_ratio,records_index); + else if( 0 == strcmp(buff,"t")){ + getLine("Enter file name:\n", buff, sz); + print_latex_records_to_file(num_exponents,exponents,records_ratio,records_index,buff); + } } while(cont < NUM_THREADS); // wait for each thread to complete diff --git a/double-error.c b/double-error.c index fa6db67..86f8f69 100644 --- a/double-error.c +++ b/double-error.c @@ -11,7 +11,8 @@ typedef struct {double v; double e;} double_error; double_error int_to_valuetype(int i){ double_error de; de.v = (double) i; - de.e = EPS*abs(i); + if(abs(i) < 9999999) de.e = 0.0; + else de.e = EPS*abs(i); return de; } @@ -22,11 +23,6 @@ double_error int_to_exptype(double d){ return de; } -int to_string(char* s, double_error de){ - sprintf(s,"%f… +/- %6.1e",de.v,de.e); - return 0; -} - double_error sum(double_error de1, double_error de2){ double_error de; de.v = de1.v + de2.v; @@ -116,8 +112,28 @@ double valuetype_to_double(double_error de){ return de.v; } double inv_exptype_to_double(double_error de){ return 1.0/de.v; } +int valuetype_to_string(char* s, double_error de){ + sprintf(s,"%f… +/- %6.1e",de.v,de.e); + return 0; +} + +int valuetype_to_latex(char* s, double_error de){ + if(de.e == 0.0){ + if(de.v == 0.0) sprintf(s,"$0$"); + else if(de.v == 1.0) sprintf(s,"$1$"); + } + else sprintf(s,"$%4.3f\\ldots\\pm\\texttt{%1.0e}$",de.v,de.e); + return 0; +} + int root_to_string(char* s, double_error de, double_error p){ double_error de1p = power(de,ratio(int_to_valuetype(1),p)); - to_string(s,de1p); + valuetype_to_string(s,de1p); + return 0; +} + +int root_to_latex(char* s, double_error de, double_error p){ + double_error de1p = power(de,ratio(int_to_valuetype(1),p)); + valuetype_to_latex(s,de1p); return 0; } diff --git a/double-error.h b/double-error.h index f0b3e87..c9ee4bb 100644 --- a/double-error.h +++ b/double-error.h @@ -31,8 +31,12 @@ double valuetype_to_double(double_error); double inv_exptype_to_double(double_error); -int to_string(char*,double_error); +int valuetype_to_string(char*,double_error); + +int valuetype_to_latex(char*,double_error); int root_to_string(char*,double_error,double_error); +int root_to_latex(char*,double_error,double_error); + #endif @@ -33,12 +33,24 @@ double valuetype_to_double(double d){ return d; } double inv_exptype_to_double(double d){ return 1.0/d; } -int to_string(char* s, double d){ +int valuetype_to_string(char* s, double d){ sprintf(s,"%f",d); return 0; } +int valuetype_to_latex(char* s, double d){ + if( d == 0.0) sprintf(s,"$0$"); + else if( d == 1.0) sprintf(s,"$1$"); + else sprintf(s,"$%4.3f$",d); + return 0; +} + int root_to_string(char* s, double d, double p){ - to_string(s,pow(d,1/p)); + valuetype_to_string(s,pow(d,1.0/p)); + return 0; +} + +int root_to_latex(char* s, double d, double p){ + valuetype_to_latex(s,pow(d,1.0/p)); return 0; } @@ -29,8 +29,12 @@ double valuetype_to_double(double); double inv_exptype_to_double(double); -int to_string(char*,double); +int valuetype_to_string(char*,double); + +int valuetype_to_latex(char*,double); int root_to_string(char*,double,double); +int root_to_latex(char*,double,double); + #endif @@ -137,14 +137,35 @@ double valuetype_to_double(rational r){ return i*((double)r.n)/((double)r.d); } -int to_string(char* s, rational r){ +int valuetype_to_string(char* s, rational r){ double f = valuetype_to_double(r); sprintf(s,"%llu / %llu = %f… +/- %6.1e",r.n,r.d,f,f*DBL_EPSILON); return 0; } +int valuetype_to_latex(char* s, rational r){ + if(r.d == 1) { + if(r.n == 0) sprintf(s,"$0$"); + else if(r.s) sprintf(s,"$-%lld$",r.n); + else if(!r.s) sprintf(s,"$%lld$",r.n); + } + else{ + double f = valuetype_to_double(r); + sprintf(s,"$\\frac{%llu}{%llu} = %4.3f\\ldots$",r.n,r.d,f); + //sprintf(s,"$\\frac{%llu}{%llu} = %3.2f\\ldots \\pm %1.0e$",r.n,r.d,f,f*DBL_EPSILON); + } + return 0; +} + int root_to_string(char* s, rational r, unsigned int p){ double f = pow(valuetype_to_double(r),1.0/p); sprintf(s,"(%llu / %llu)^1/%i = %f… +/- %6.1e",r.n,r.d,p,f,2*DBL_EPSILON*f); return 0; } + +int root_to_latex(char* s, rational r, unsigned int p){ + double f = pow(valuetype_to_double(r),1.0/p); + sprintf(s,"$\\bigl(\\frac{%llu}{%llu}\\bigr)^{\\frac1{%i}} = %4.3f\\ldots$",r.n,r.d,p,f); + //sprintf(s,"$\\bigl(\\frac{%llu}{%llu}\\bigr)^{\\frac1{%i}} = %3.2f\\ldots \\pm %1.0e$",r.n,r.d,p,f,2*DBL_EPSILON*f); + return 0; +} @@ -31,8 +31,12 @@ double valuetype_to_double(rational); double inv_exptype_to_double(int); -int to_string(char*,rational r); +int valuetype_to_string(char*,rational r); + +int valuetype_to_latex(char*,rational r); int root_to_string(char*,rational r,unsigned int); +int root_to_latex(char*,rational r,unsigned int); + #endif |
