summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--charf.c32
-rw-r--r--double-error.c40
-rw-r--r--double-error.h12
-rw-r--r--double.c36
-rw-r--r--double.h8
-rw-r--r--ratio.c53
-rw-r--r--ratio.h8
7 files changed, 141 insertions, 48 deletions
diff --git a/charf.c b/charf.c
index c33a88d..520e8cb 100644
--- a/charf.c
+++ b/charf.c
@@ -68,8 +68,8 @@ void differentiate(VALUETYPE* f, VALUETYPE* df, int D, int k){
VALUETYPE integratep(VALUETYPE* f, EXPTYPE p, int D){
VALUETYPE integralp = int_to_valuetype(0);
for(int i=0; i<D; i++){
- VALUETYPE padd = power(absolute(f[i]),p);
- integralp = sum(integralp,padd);
+ if(exptype_is_infinite(p)) integralp = maximum(integralp,absolute(f[i]));
+ else integralp = sum(integralp,power(absolute(f[i]),p));
}
return integralp;
}
@@ -172,20 +172,26 @@ void format_result(char* s, int index, int k, EXPTYPE p, VALUETYPE r, int format
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," ");
+ for(int i=0; i<d; i++){
+ char v[8];
+ valuetype_to_string(v,f[i]);
+ l += sprintf(s+l,"%s ",v);
+ }
+ for(int i=d; i<N; i++) l += sprintf(s+l," ");
+ char e[16];
char rts[128];
+ exptype_to_string(e,p);
root_to_string(rts,r,p);
- l += sprintf(s+l,"|f^(%d)|_1/%2.1f: %s",k,exptype_to_double(p),rts);
+ l += sprintf(s+l,"|f^(%d)|_%s: %s",k,e,rts);
}
else if(format == FORMAT_LATEX){
int l = 0;
char v[128];
root_to_latex(v,r,p);
- l += sprintf(s+l,"$%d$ & %s",k,v);
+ l += sprintf(s+l,"$%d$ & $%s$",k,v);
for(int i=0; i<d; i++){
valuetype_to_latex(v,f[i]);
- l += sprintf(s+l,"& %s ",v);
+ l += sprintf(s+l,"& $%s$ ",v);
}
for(int i=d; i<N; i++) l += sprintf(s+l,"& ");
}
@@ -270,13 +276,15 @@ void format_results(char* text, EXPTYPE exponents[P], VALUETYPE ratios[K+1][P],
char beginningp[P][1024];
char endp[P][1024];
char newline[4];
+ char e[8];
if(format == FORMAT_TEXT){
strcpy(beginning,"Current records:");
strcpy(end,"");
for(int p=0; p<P; p++){
- sprintf(beginningp[p],"exponent %2.1f:",exptype_to_double(exponents[p]));
+ exptype_to_string(e,exponents[p]);
+ sprintf(beginningp[p],"exponent %s:",e);
strcpy(endp[p],"");
}
@@ -295,8 +303,9 @@ void format_results(char* text, EXPTYPE exponents[P], VALUETYPE ratios[K+1][P],
for(int n=1; n<N; n++) strcat(f,"& ");
strcat(f,"\\\\\n\\hline");
for(int p=0; p<P; p++){
- sprintf(beginningp[p],"$p=%1.0f$:\n\n\\begin{tabular}%s\n%s",exptype_to_double(exponents[p]),h,f);
- strcpy(endp[p],"\\end{tabular}\n");
+ exptype_to_latex(e,exponents[p]);
+ sprintf(beginningp[p],"\\begin{table}\n\\begin{tabular}%s\n%s",h,f);
+ sprintf(endp[p],"\\end{tabular}\n\\caption{$p=%s$:}\n\\end{table}",e);
}
strcpy(newline,"\\\\");
}
@@ -360,7 +369,8 @@ int main() {
int num_exponents[K+1];
EXPTYPE exponents[P];
exponents[0] = int_to_exptype(1);
- exponents[1] = int_to_exptype(2);
+ //exponents[1] = int_to_exptype(2);
+ exponents[1] = infinity_to_exptype();
pthread_t threads[NUM_THREADS];
Args args[NUM_THREADS];
diff --git a/double-error.c b/double-error.c
index 9490671..8df0974 100644
--- a/double-error.c
+++ b/double-error.c
@@ -16,13 +16,17 @@ double_error int_to_valuetype(int i){
return de;
}
-double_error int_to_exptype(double d){
+double_error int_to_exptype(int i){ return int_to_valuetype(i); }
+
+double_error infinity_to_exptype(){
double_error de;
- de.v = d;
- de.e = EPS*fabs(d) + DBL_MIN;
+ de.v = INFINITY;
+ de.e = 0;
return de;
}
+bool exptype_is_infinite(double_error d){ return d.v == INFINITY; }
+
double_error sum(double_error de1, double_error de2){
double_error de;
de.v = de1.v + de2.v;
@@ -113,27 +117,45 @@ double valuetype_to_double(double_error de){ return de.v; }
double exptype_to_double(double_error de){ return de.v; }
int valuetype_to_string(char* s, double_error de){
- sprintf(s,"%f… +/- %6.1e",de.v,de.e);
+ if(de.e == 0.0){
+ if(de.v == 0.0 || de.v == 1.0 || de.v == 2.0 || de.v == 4.0 || de.v == 8.0 || de.v == 16.0) sprintf(s,"%d", (int)de.v);
+ else sprintf(s,"%4.3f…",de.v);
+ }
+ else sprintf(s,"%4.3f… +/- %6.1e",de.v,de.e);
return 0;
}
+int exptype_to_string(char* s, double_error de){
+ if(exptype_is_infinite(de)) return sprintf(s,"inf");
+ else return valuetype_to_string(s,de);
+}
+
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$");
+ if(de.v == 0.0 || de.v == 1.0 || de.v == 2.0 || de.v == 4.0 || de.v == 8.0 || de.v == 16.0) sprintf(s,"%d", (int)de.v);
+ else sprintf(s,"%4.3f\\ldots",de.v);
}
- else sprintf(s,"$%4.3f\\ldots\\pm\\texttt{%1.0e}$",de.v,de.e);
+ else sprintf(s,"%4.3f\\ldots\\pm\\texttt{%1.0e}",de.v,de.e);
return 0;
}
+int exptype_to_latex(char* s, double_error de){
+ if(exptype_is_infinite(de)) return sprintf(s,"\\infty");
+ else return valuetype_to_latex(s,de);
+}
+
int root_to_string(char* s, double_error de, double_error p){
- double_error de1p = power(de,ratio(int_to_valuetype(1),p));
+ double_error de1p;
+ if(exptype_is_infinite(p)) de1p = de;
+ else de1p = power(de,ratio(int_to_valuetype(1),p));
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));
+ double_error de1p;
+ if(exptype_is_infinite(p)) de1p = de;
+ else 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 d89b9b8..dbfe283 100644
--- a/double-error.h
+++ b/double-error.h
@@ -7,7 +7,11 @@ typedef struct {double v; double e;} double_error;
double_error int_to_valuetype(int);
-double_error int_to_exptype(double);
+double_error int_to_exptype(int);
+
+double_error infinity_to_exptype();
+
+bool exptype_is_infinite(double_error);
bool is_greater_certainly(double_error,double_error);
@@ -29,12 +33,14 @@ double_error power(double_error,double_error);
double valuetype_to_double(double_error);
-double exptype_to_double(double_error);
-
int valuetype_to_string(char*,double_error);
int valuetype_to_latex(char*,double_error);
+int exptype_to_string(char*,double_error);
+
+int exptype_to_latex(char*,double_error);
+
int root_to_string(char*,double_error,double_error);
int root_to_latex(char*,double_error,double_error);
diff --git a/double.c b/double.c
index 09fcc28..0799e7d 100644
--- a/double.c
+++ b/double.c
@@ -8,6 +8,10 @@ double int_to_valuetype(int i){ return (double) i; }
double int_to_exptype(double d){ return d; }
+double infinity_to_exptype(){ return INFINITY; }
+
+bool exptype_is_infinite(double d){ return d==INFINITY; }
+
double sum(double d1, double d2){ return d1+d2; }
double difference(double d1, double d2){ return d1-d2; }
@@ -31,26 +35,38 @@ double power(double d, double p) { return pow(d,p); }
double valuetype_to_double(double d){ return d; }
-double exptype_to_double(double d){ return d; }
-
int valuetype_to_string(char* s, double d){
- sprintf(s,"%f",d);
+ if( d == 0.0 || d == 1.0 || d == 2.0 || d == 4.0 || d == 8.0 || d == 16.0 ) sprintf(s,"%d", (int)d);
+ else sprintf(s,"%4.3f",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 valuetype_to_latex(char* s, double d){ return valuetype_to_string(s,d); }
+
+int exptype_to_string(char *s, double p){
+ if(exptype_is_infinite(p)){
+ sprintf(s,"inf");
+ return 0;
+ }
+ else return valuetype_to_string(s,p);
+}
+
+int exptype_to_latex(char *s, double p){
+ if(exptype_is_infinite(p)){
+ sprintf(s,"\\infty");
+ return 0;
+ }
+ else return valuetype_to_latex(s,p);
}
int root_to_string(char* s, double d, double p){
- valuetype_to_string(s,pow(d,1.0/p));
+ if(exptype_is_infinite(p)) valuetype_to_string(s,d);
+ else 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));
+ if(exptype_is_infinite(p)) valuetype_to_latex(s,d);
+ else valuetype_to_latex(s,pow(d,1.0/p));
return 0;
}
diff --git a/double.h b/double.h
index 303f911..032d994 100644
--- a/double.h
+++ b/double.h
@@ -7,6 +7,10 @@ double int_to_valuetype(int);
double int_to_exptype(double);
+double infinity_to_exptype();
+
+bool exptype_is_infinite(double);
+
bool is_greater_certainly(double,double);
bool is_greater_possibly(double,double);
@@ -27,7 +31,9 @@ double power(double,double);
double valuetype_to_double(double);
-double exptype_to_double(double);
+int exptype_to_string(char*,double);
+
+int exptype_to_latex(char*,double);
int valuetype_to_string(char*,double);
diff --git a/ratio.c b/ratio.c
index ecc20fb..fa7dc17 100644
--- a/ratio.c
+++ b/ratio.c
@@ -37,6 +37,10 @@ rational int_to_valuetype(int i){
return r;
}
+unsigned int infinity_to_exptype(){ return UINT_MAX; }
+
+bool exptype_is_infinite(num p){ return p == UINT_MAX; }
+
unsigned int int_to_exptype(unsigned int i){ return i; }
num gcd(num a, num b){
@@ -129,7 +133,17 @@ rational power(rational r, unsigned int p){
return s;
}
-double exptype_to_double(int r){ return (double)r; }
+int exptype_to_string(char *s, unsigned int p){
+ if(exptype_is_infinite(p)) sprintf(s,"inf",p);
+ else sprintf(s,"%d",p);
+ return 0;
+}
+
+int exptype_to_latex(char *s, unsigned int p){
+ if(exptype_is_infinite(p)) sprintf(s,"\\infty",p);
+ else sprintf(s,"%d",p);
+ return 0;
+}
double valuetype_to_double(rational r){
double i;
@@ -138,34 +152,47 @@ double valuetype_to_double(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);
+ 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,"%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);
+ 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);
+ 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);
+ if(exptype_is_infinite(p) || p == 1) valuetype_to_string(s,r);
+ else{
+ 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);
+ if(exptype_is_infinite(p) || p == 1) valuetype_to_latex(s,r);
+ else{
+ 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 87e210d..d17f0ae 100644
--- a/ratio.h
+++ b/ratio.h
@@ -9,6 +9,10 @@ rational int_to_valuetype(int);
unsigned int int_to_exptype(unsigned int);
+unsigned int infinity_to_exptype();
+
+bool exptype_is_infinite(unsigned int);
+
bool is_greater_certainly(rational,rational);
bool is_greater_possibly(rational,rational);
@@ -29,7 +33,9 @@ rational power(rational,unsigned int);
double valuetype_to_double(rational);
-double exptype_to_double(int);
+int exptype_to_string(char*,unsigned int);
+
+int exptype_to_latex(char*,unsigned int);
int valuetype_to_string(char*,rational r);