From 470b14ac5e1a852ad36a9fd7ff580aaab7d23053 Mon Sep 17 00:00:00 2001 From: Julian Weigt Date: Mon, 22 Dec 2025 23:01:36 +0000 Subject: Start writing exact version of charf.c. --- charf.c | 15 +++++++++------ double.c | 18 ++++++++++++++++++ double.h | 17 +++++++++++++++++ ratio.c | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ratio.h | 23 +++++++++++++++++++++++ 5 files changed, 131 insertions(+), 6 deletions(-) create mode 100644 double.c create mode 100644 double.h create mode 100644 ratio.c create mode 100644 ratio.h diff --git a/charf.c b/charf.c index 5ce7321..ccbc265 100644 --- a/charf.c +++ b/charf.c @@ -3,12 +3,15 @@ #include #define EXACT false -#define VALUETYPE double -#define EXPTYPE double #if EXACT +#include "ratio.h" #define VALUETYPE ratio -#define EXPTYPE int +#define EXPTYPE unsigned int +#else +#include "double.h" +#define VALUETYPE double +#define EXPTYPE double #endif @@ -26,11 +29,11 @@ void differentiate(VALUETYPE** df, int D, int K){ /*given function f on domain [0,D-1] compute pth root of integral of |f|^p*/ VALUETYPE integrate(VALUETYPE* f, EXPTYPE p, int D){ - VALUETYPE sum = 0.0; + VALUETYPE integralp = 0.0; for(int i=0;i +#include + +double sum(double d1, double d2){ return d1+d2; } + +double difference(double d1, double d2){ return d1-d2; } + +bool is_greater(double d1, double d2){ return (d1 > d2); } + +double product(double d1, double d2){ return d1*d2; } + +double ratio(double d1, double d2){ return d1/d2; } + +double absolute(double d){ return abs(d); } + +double power(double d, double p) { return pow(d,p); } + +double to_double(double d){ return d; } diff --git a/double.h b/double.h new file mode 100644 index 0000000..3f31782 --- /dev/null +++ b/double.h @@ -0,0 +1,17 @@ +double convert_int(int); + +bool is_greater(double,double); + +double sum(double,double); + +double difference(double,double); + +double product(double,double); + +double ratio(double,double); + +double absolute(double); + +double power(double,double); + +double to_double(double); diff --git a/ratio.c b/ratio.c new file mode 100644 index 0000000..8c67538 --- /dev/null +++ b/ratio.c @@ -0,0 +1,64 @@ +#include +#include +#include + +typedef struct {long int n; long unsigned int d} rational; + +rational convert_int(int i){ + rational r = {i,1}; + return r; +} + +rational cancel(rational r){ + long unsigned int a = abs(r.n), b = r.d, c; + while (b) { + c = a % b; + a = b; + b = c; + } + rational res = {r.n/a,r.d/a}; + return res; +} + +rational sum(rational r1, rational r2){ + rational r = {r1.n*r2.d+r2.n*r1.d,r1.d*r2.d}; + return cancel(r); +} + +rational difference(rational r1, rational r2){ + rational r = {r1.n*r2.d-r2.n*r1.d,r1.d*r2.d}; + return cancel(r); +} + +bool is_greater(rational r1, rational r2){ return (difference(r1,r2).n > 0); } + +rational product(rational r1, rational r2){ + rational r = {r1.n*r2.n,r1.d*r2.d}; + return cancel(r); +} + +rational ratio(rational r1, rational r2){ + rational r = {0,1}; + if (r2.n>0){ + rational r = {0,1}; + } + else{ + rational r = {-r1.n*r2.d,r1.d*(-r2.n)}; + } + return cancel(r); +} + +double to_double(rational r){ return ((double)r.n)/((double)r.d); } + +rational absolute(rational r){ + rational s = {abs(r.n),r.d}; + return s; +} + +rational power(rational r, unsigned int p){ + rational s = {1,1}; + for(int i = 1; i<= p; i++){ + rational s = product(r,s); + } + return s; +} diff --git a/ratio.h b/ratio.h new file mode 100644 index 0000000..26ed1c2 --- /dev/null +++ b/ratio.h @@ -0,0 +1,23 @@ +#include +#include +#include + +typedef struct {long int n; long unsigned int d}rational; + +rational convert_int(int); + +bool is_greater(rational,rational); + +rational sum(rational,rational); + +rational difference(rational,rational); + +rational product(rational,rational); + +rational ratio(rational,rational); + +rational absolute(rational); + +rational power(rational,unsigned int); + +double to_double(rational); -- cgit v1.2.3