From b7835be8db1d6d2ef60bbe9e972cb708c0fee8c0 Mon Sep 17 00:00:00 2001 From: Julian Weigt Date: Sun, 18 Jan 2026 13:28:25 +0100 Subject: =?UTF-8?q?Allow=20p=3D=E2=88=9E=20in=20program=20and=20adjust=20a?= =?UTF-8?q?nd=20generalize=20printing=20accordingly.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ratio.c | 53 ++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 40 insertions(+), 13 deletions(-) (limited to 'ratio.c') 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; } -- cgit v1.2.3