summaryrefslogtreecommitdiff
path: root/ratio.c
diff options
context:
space:
mode:
Diffstat (limited to 'ratio.c')
-rw-r--r--ratio.c53
1 files changed, 40 insertions, 13 deletions
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;
}