]> gitweb.factorcode.org Git - factor.git/blob - native/ratio.c
first cut at floats
[factor.git] / native / ratio.c
1 #include "factor.h"
2
3 RATIO* ratio(CELL numerator, CELL denominator)
4 {
5         RATIO* ratio = (RATIO*)allot(sizeof(RATIO));
6         ratio->numerator = numerator;
7         ratio->denominator = denominator;
8         return ratio;
9 }
10
11 void primitive_ratiop(void)
12 {
13         check_non_empty(env.dt);
14         env.dt = tag_boolean(typep(RATIO_TYPE,env.dt));
15 }
16
17 void primitive_numerator(void)
18 {
19         switch(type_of(env.dt))
20         {
21         case FIXNUM_TYPE:
22         case BIGNUM_TYPE:
23                 /* No op */
24                 break;
25         case RATIO_TYPE:
26                 env.dt = untag_ratio(env.dt)->numerator;
27                 break;
28         default:
29                 type_error(RATIO_TYPE,env.dt);
30                 break;
31         }
32 }
33
34 void primitive_denominator(void)
35 {
36         switch(type_of(env.dt))
37         {
38         case FIXNUM_TYPE:
39         case BIGNUM_TYPE:
40                 env.dt = tag_fixnum(1);
41                 break;
42         case RATIO_TYPE:
43                 env.dt = untag_ratio(env.dt)->denominator;
44                 break;
45         default:
46                 type_error(RATIO_TYPE,env.dt);
47                 break;
48         }
49 }
50
51 CELL number_eq_ratio(CELL x, CELL y)
52 {
53         RATIO* rx = (RATIO*)UNTAG(x);
54         RATIO* ry = (RATIO*)UNTAG(y);
55         return tag_boolean(
56                 untag_boolean(number_eq(rx->numerator,ry->numerator)) &&
57                 untag_boolean(number_eq(rx->denominator,ry->denominator)));
58 }
59
60 CELL add_ratio(CELL x, CELL y)
61 {
62         RATIO* rx = (RATIO*)UNTAG(x);
63         RATIO* ry = (RATIO*)UNTAG(y);
64         return divide(add(multiply(rx->numerator,ry->denominator),
65                 multiply(rx->denominator,ry->numerator)),
66                 multiply(rx->denominator,ry->denominator));
67 }
68
69 CELL subtract_ratio(CELL x, CELL y)
70 {
71         RATIO* rx = (RATIO*)UNTAG(x);
72         RATIO* ry = (RATIO*)UNTAG(y);
73         return divide(subtract(multiply(rx->numerator,ry->denominator),
74                 multiply(rx->denominator,ry->numerator)),
75                 multiply(rx->denominator,ry->denominator));
76 }
77
78 CELL multiply_ratio(CELL x, CELL y)
79 {
80         RATIO* rx = (RATIO*)UNTAG(x);
81         RATIO* ry = (RATIO*)UNTAG(y);
82         return divide(
83                 multiply(rx->numerator,ry->numerator),
84                 multiply(rx->denominator,ry->denominator));
85 }
86
87 CELL divide_ratio(CELL x, CELL y)
88 {
89         RATIO* rx = (RATIO*)UNTAG(x);
90         RATIO* ry = (RATIO*)UNTAG(y);
91         return divide(
92                 multiply(rx->numerator,ry->denominator),
93                 multiply(rx->denominator,ry->numerator));
94 }
95
96 CELL divfloat_ratio(CELL x, CELL y)
97 {
98         RATIO* rx = (RATIO*)UNTAG(x);
99         RATIO* ry = (RATIO*)UNTAG(y);
100         return divfloat(
101                 multiply(rx->numerator,ry->denominator),
102                 multiply(rx->denominator,ry->numerator));
103 }
104
105 CELL less_ratio(CELL x, CELL y)
106 {
107         RATIO* rx = (RATIO*)UNTAG(x);
108         RATIO* ry = (RATIO*)UNTAG(y);
109         return less(multiply(rx->numerator,ry->denominator),
110                 multiply(ry->numerator,rx->denominator));
111 }
112
113 CELL lesseq_ratio(CELL x, CELL y)
114 {
115         RATIO* rx = (RATIO*)UNTAG(x);
116         RATIO* ry = (RATIO*)UNTAG(y);
117         return lesseq(multiply(rx->numerator,ry->denominator),
118                 multiply(ry->numerator,rx->denominator));
119 }
120
121 CELL greater_ratio(CELL x, CELL y)
122 {
123         RATIO* rx = (RATIO*)UNTAG(x);
124         RATIO* ry = (RATIO*)UNTAG(y);
125         return greater(multiply(rx->numerator,ry->denominator),
126                 multiply(ry->numerator,rx->denominator));
127 }
128
129 CELL greatereq_ratio(CELL x, CELL y)
130 {
131         RATIO* rx = (RATIO*)UNTAG(x);
132         RATIO* ry = (RATIO*)UNTAG(y);
133         return greatereq(multiply(rx->numerator,ry->denominator),
134                 multiply(ry->numerator,rx->denominator));
135 }