7 #include "cl_rational.h"
12 struct cl_heap_ratio : cl_heap {
17 inline cl_heap_ratio* TheRatio (cl_heap_ratio* p)
19 inline cl_heap_ratio* TheRatio (const cl_number& obj)
20 { return (cl_heap_ratio*)(obj.pointer); }
22 inline cl_heap_ratio* allocate_ratio (const cl_I& num, const cl_I& den)
24 cl_heap_ratio* p = (cl_heap_ratio*) cl_malloc_hook(sizeof(cl_heap_ratio));
26 p->type = &cl_class_ratio;
27 p->numerator.pointer = num.pointer; cl_inc_refcount(num);
28 p->denominator.pointer = den.pointer; cl_inc_refcount(den);
32 // Private constructor.
33 // ptr should be the result of some allocate_ratio() call.
34 inline cl_RA::cl_RA (cl_heap_ratio* ptr)
35 : cl_R ((cl_private_thing) ptr) {}
37 // Both work, but the first definition results in less compiler-generated
40 #define Ratio cl_heap_ratio*
46 inline cl_boolean rationalp (const cl_RA& x)
47 { unused x; return cl_true; }
48 inline cl_boolean integerp (const cl_RA& x)
53 if (x.pointer_type() == &cl_class_bignum)
57 inline cl_boolean ratiop (const cl_RA& x)
62 if (x.pointer_type() == &cl_class_bignum)
68 // A ratio (cl_RT) is a rational number which is not an integer (cl_I).
71 class cl_RT : public cl_RA {
75 inline cl_boolean integerp (const cl_RT& x)
76 { unused x; return cl_false; }
77 inline cl_boolean ratiop (const cl_RT& x)
78 { unused x; return cl_true; }
80 // Access numerator and denominator.
81 inline const cl_I& numerator (const cl_RT& x)
82 { return TheRatio(x)->numerator; }
83 inline const cl_I& denominator (const cl_RT& x)
84 { return TheRatio(x)->denominator; }
89 // (MINUSP x) == (< x 0)
90 inline cl_boolean minusp (const cl_RT& x)
91 { return minusp(numerator(x)); }
92 inline cl_boolean minusp (const cl_RA& x)
103 // (ZEROP x) == (= x 0)
104 inline cl_boolean zerop (const cl_RT& x)
105 { unused x; return cl_false; }
106 inline cl_boolean zerop (const cl_RA& x)
108 return (cl_boolean)(x.word == cl_combine(cl_FN_tag,0));
111 // (EQ x y) == (= x y), assuming y a fixnum
112 inline cl_boolean eq (const cl_RA& x, sint32 y)
114 return (cl_boolean)(x.word == cl_combine(cl_FN_tag,y));
117 // Liefert zu den Integers a und b mit b>1 und ggT(a,b)=1 den Bruch a/b.
119 extern const cl_RA I_I_to_RT (const cl_I& a, const cl_I& b);
121 // Liefert zu den Integers a und b mit b>0 und ggT(a,b)=1 den Bruch a/b
122 // (Ratio oder Integer).
124 extern const cl_RA I_I_to_RA (const cl_I& a, const cl_I& b);
126 // Liefert zu den Integers a und b mit b>0 den Bruch a/b (Ratio oder Integer).
127 // I_posI_div_RA(a,b)
128 extern const cl_RA I_posI_div_RA (const cl_I& a, const cl_I& b);
130 // Liefert zu den Integers a und b den Bruch a/b (Ratio oder Integer).
132 extern const cl_RA I_I_div_RA (const cl_I& a, const cl_I& b);
134 // Liefert den Zähler einer rationalen Zahl.
136 inline const cl_I numerator (const cl_RA& r)
142 return TheRatio(r)->numerator;
145 // Liefert den Nenner einer rationalen Zahl.
147 inline const cl_I denominator (const cl_RA& r)
152 return TheRatio(r)->denominator;
155 // Liefert Zähler und Nenner einer rationalen Zahl.
156 // RA_numden_I_I(r, num=,den=);
157 // > r: rationale Zahl
158 // < num: (numerator r)
159 // < den: (denominator r)
160 #define RA_numden_I_I(r,num_zuweisung,den_zuweisung) \
162 { num_zuweisung *(const cl_I *)&r; \
163 den_zuweisung 1; /* Zähler = r, Nenner = 1 */ \
166 { num_zuweisung TheRatio(r)->numerator; \
167 den_zuweisung TheRatio(r)->denominator; \
172 #endif /* _CL_RA_H */