diff options
| -rw-r--r-- | charf.c | 32 | ||||
| -rw-r--r-- | double-error.c | 40 | ||||
| -rw-r--r-- | double-error.h | 12 | ||||
| -rw-r--r-- | double.c | 36 | ||||
| -rw-r--r-- | double.h | 8 | ||||
| -rw-r--r-- | ratio.c | 53 | ||||
| -rw-r--r-- | ratio.h | 8 |
7 files changed, 141 insertions, 48 deletions
@@ -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); @@ -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; } @@ -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); @@ -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; } @@ -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); |
