summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--charf.c82
-rw-r--r--double-error.c30
-rw-r--r--double-error.h6
-rw-r--r--double.c16
-rw-r--r--double.h6
-rw-r--r--ratio.c23
-rw-r--r--ratio.h6
7 files changed, 142 insertions, 27 deletions
diff --git a/charf.c b/charf.c
index b635391..a673084 100644
--- a/charf.c
+++ b/charf.c
@@ -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
diff --git a/double.c b/double.c
index b84b49a..eba6127 100644
--- a/double.c
+++ b/double.c
@@ -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;
}
diff --git a/double.h b/double.h
index 707e1e6..5960cb6 100644
--- a/double.h
+++ b/double.h
@@ -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
diff --git a/ratio.c b/ratio.c
index 92e39d8..b25b221 100644
--- a/ratio.c
+++ b/ratio.c
@@ -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;
+}
diff --git a/ratio.h b/ratio.h
index 884681d..c0c24cb 100644
--- a/ratio.h
+++ b/ratio.h
@@ -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