summaryrefslogtreecommitdiff
path: root/ratio.c
diff options
context:
space:
mode:
authorJulian Weigt <juw@posteo.de>2025-12-22 23:01:36 +0000
committerJulian Weigt <juw@posteo.de>2026-02-04 15:55:45 +0100
commit470b14ac5e1a852ad36a9fd7ff580aaab7d23053 (patch)
treea942e1e051d35f19118e99a6402afbb443679759 /ratio.c
parent01f37f5a70891532f62925fab41b82fe9a194789 (diff)
Start writing exact version of charf.c.
Diffstat (limited to 'ratio.c')
-rw-r--r--ratio.c64
1 files changed, 64 insertions, 0 deletions
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 <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+
+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;
+}