You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

519 lines
21 KiB

25 years ago
  1. // Public real number operations.
  2. #ifndef _CL_REAL_H
  3. #define _CL_REAL_H
  4. #include "cl_number.h"
  5. #include "cl_real_class.h"
  6. #include "cl_rational_class.h"
  7. #include "cl_integer_class.h"
  8. #include "cl_float.h"
  9. #include "cl_floatformat.h"
  10. #include "cl_random.h"
  11. CL_DEFINE_AS_CONVERSION(cl_R)
  12. // zerop(x) testet, ob (= x 0).
  13. extern cl_boolean zerop (const cl_R& x);
  14. // minusp(x) testet, ob (< x 0).
  15. extern cl_boolean minusp (const cl_R& x);
  16. // plusp(x) testet, ob (> x 0).
  17. extern cl_boolean plusp (const cl_R& x);
  18. // R_to_SF(x) wandelt eine reelle Zahl x in ein Short-Float um.
  19. // < ergebnis: (coerce x 'short-float)
  20. extern const cl_SF cl_R_to_SF (const cl_R& x);
  21. // R_to_FF(x) wandelt eine reelle Zahl x in ein Single-Float um.
  22. // < ergebnis: (coerce x 'single-float)
  23. extern const cl_FF cl_R_to_FF (const cl_R& x);
  24. // R_to_DF(x) wandelt eine reelle Zahl x in ein Double-Float um.
  25. // < ergebnis: (coerce x 'double-float)
  26. extern const cl_DF cl_R_to_DF (const cl_R& x);
  27. // R_to_LF(x,len) wandelt eine reelle Zahl x in ein Long-Float mit len Digits um.
  28. // > uintC len: gew�nschte Anzahl Digits, >=LF_minlen
  29. // < ergebnis: (coerce x `(long-float ,len))
  30. extern const cl_LF cl_R_to_LF (const cl_R& x, uintC len);
  31. // cl_float(x,y) wandelt eine reelle Zahl x in das Float-Format des
  32. // Floats y um und rundet dabei n�tigenfalls.
  33. // > x: eine reelle Zahl
  34. // > y: ein Float
  35. // < ergebnis: (float x y)
  36. extern const cl_F cl_float (const cl_R& x, const cl_F& y);
  37. // cl_float(x,f) wandelt eine reelle Zahl x in das Float-Format f um
  38. // und rundet dabei n�tigenfalls.
  39. // > x: eine reelle Zahl
  40. // > f: eine Float-Format-Spezifikation
  41. // < ergebnis: (float x f)
  42. extern const cl_F cl_float (const cl_R& x, cl_float_format_t f);
  43. // cl_float(x) wandelt eine reelle Zahl x in ein Float um
  44. // und rundet dabei n�tigenfalls.
  45. // > x: eine reelle Zahl
  46. // < ergebnis: (float x)
  47. // Abh�ngig von cl_default_float_format.
  48. extern const cl_F cl_float (const cl_R& x);
  49. // Liefert (- x), wo x eine reelle Zahl ist.
  50. extern const cl_R operator- (const cl_R& x);
  51. // Liefert (+ x y), wo x und y reelle Zahlen sind.
  52. extern const cl_R operator+ (const cl_R& x, const cl_R& y);
  53. // Spezialfall: x oder y Float -> Ergebnis Float
  54. inline const cl_F operator+ (const cl_R& x, const cl_F& y)
  55. { return The(cl_F)(x + The(cl_R)(y)); }
  56. inline const cl_F operator+ (const cl_F& x, const cl_R& y)
  57. { return The(cl_F)(The(cl_R)(x) + y); }
  58. // Dem C++-Compiler mu� man nun auch das Folgende sagen:
  59. inline const cl_R operator+ (const int x, const cl_R& y)
  60. { return cl_I(x) + y; }
  61. inline const cl_R operator+ (const unsigned int x, const cl_R& y)
  62. { return cl_I(x) + y; }
  63. inline const cl_R operator+ (const long x, const cl_R& y)
  64. { return cl_I(x) + y; }
  65. inline const cl_R operator+ (const unsigned long x, const cl_R& y)
  66. { return cl_I(x) + y; }
  67. inline const cl_R operator+ (const cl_R& x, const int y)
  68. { return x + cl_I(y); }
  69. inline const cl_R operator+ (const cl_R& x, const unsigned int y)
  70. { return x + cl_I(y); }
  71. inline const cl_R operator+ (const cl_R& x, const long y)
  72. { return x + cl_I(y); }
  73. inline const cl_R operator+ (const cl_R& x, const unsigned long y)
  74. { return x + cl_I(y); }
  75. // Liefert (- x y), wo x und y reelle Zahlen sind.
  76. extern const cl_R operator- (const cl_R& x, const cl_R& y);
  77. // Spezialfall: x oder y Float -> Ergebnis Float
  78. inline const cl_F operator- (const cl_R& x, const cl_F& y)
  79. { return The(cl_F)(x - The(cl_R)(y)); }
  80. inline const cl_F operator- (const cl_F& x, const cl_R& y)
  81. { return The(cl_F)(The(cl_R)(x) - y); }
  82. // Dem C++-Compiler mu� man nun auch das Folgende sagen:
  83. inline const cl_R operator- (const int x, const cl_R& y)
  84. { return cl_I(x) - y; }
  85. inline const cl_R operator- (const unsigned int x, const cl_R& y)
  86. { return cl_I(x) - y; }
  87. inline const cl_R operator- (const long x, const cl_R& y)
  88. { return cl_I(x) - y; }
  89. inline const cl_R operator- (const unsigned long x, const cl_R& y)
  90. { return cl_I(x) - y; }
  91. inline const cl_R operator- (const cl_R& x, const int y)
  92. { return x - cl_I(y); }
  93. inline const cl_R operator- (const cl_R& x, const unsigned int y)
  94. { return x - cl_I(y); }
  95. inline const cl_R operator- (const cl_R& x, const long y)
  96. { return x - cl_I(y); }
  97. inline const cl_R operator- (const cl_R& x, const unsigned long y)
  98. { return x - cl_I(y); }
  99. // Liefert (* x y), wo x und y reelle Zahlen sind.
  100. extern const cl_R operator* (const cl_R& x, const cl_R& y);
  101. // Dem C++-Compiler mu� man auch das Folgende sagen (wg. `int * cl_F' u.�.):
  102. inline const cl_R operator* (const int x, const cl_R& y)
  103. { return cl_I(x) * y; }
  104. inline const cl_R operator* (const unsigned int x, const cl_R& y)
  105. { return cl_I(x) * y; }
  106. inline const cl_R operator* (const long x, const cl_R& y)
  107. { return cl_I(x) * y; }
  108. inline const cl_R operator* (const unsigned long x, const cl_R& y)
  109. { return cl_I(x) * y; }
  110. inline const cl_R operator* (const cl_R& x, const int y)
  111. { return x * cl_I(y); }
  112. inline const cl_R operator* (const cl_R& x, const unsigned int y)
  113. { return x * cl_I(y); }
  114. inline const cl_R operator* (const cl_R& x, const long y)
  115. { return x * cl_I(y); }
  116. inline const cl_R operator* (const cl_R& x, const unsigned long y)
  117. { return x * cl_I(y); }
  118. // Liefert (* x x), wo x eine reelle Zahl ist.
  119. extern const cl_R square (const cl_R& x);
  120. // Liefert (/ x y), wo x und y reelle Zahlen sind.
  121. extern const cl_R operator/ (const cl_R& x, const cl_R& y);
  122. // Spezialfall: x oder y Float -> Ergebnis Float
  123. inline const cl_F operator/ (const cl_F& x, const cl_R& y)
  124. { return The(cl_F)(The(cl_R)(x) / y); }
  125. // Dem C++-Compiler mu� man auch das Folgende sagen (wg. `int / cl_F' u.�.):
  126. inline const cl_R operator/ (const int x, const cl_R& y)
  127. { return cl_I(x) / y; }
  128. inline const cl_R operator/ (const unsigned int x, const cl_R& y)
  129. { return cl_I(x) / y; }
  130. inline const cl_R operator/ (const long x, const cl_R& y)
  131. { return cl_I(x) / y; }
  132. inline const cl_R operator/ (const unsigned long x, const cl_R& y)
  133. { return cl_I(x) / y; }
  134. inline const cl_R operator/ (const cl_R& x, const int y)
  135. { return x / cl_I(y); }
  136. inline const cl_R operator/ (const cl_R& x, const unsigned int y)
  137. { return x / cl_I(y); }
  138. inline const cl_R operator/ (const cl_R& x, const long y)
  139. { return x / cl_I(y); }
  140. inline const cl_R operator/ (const cl_R& x, const unsigned long y)
  141. { return x / cl_I(y); }
  142. // Liefert (abs x), wo x eine reelle Zahl ist.
  143. extern const cl_R abs (const cl_R& x);
  144. // recip(x) liefert (/ x), wo x eine reelle Zahl ist.
  145. extern const cl_R recip (const cl_R& x);
  146. // (1+ x), wo x eine reelle Zahl ist.
  147. extern const cl_R plus1 (const cl_R& x);
  148. // (1- x), wo x eine reelle Zahl ist.
  149. extern const cl_R minus1 (const cl_R& x);
  150. // Return type for rounding operators.
  151. // x / y --> (q,r) with x = y*q+r.
  152. struct cl_R_div_t {
  153. cl_I quotient;
  154. cl_R remainder;
  155. // Constructor.
  156. cl_R_div_t () {}
  157. cl_R_div_t (const cl_I& q, const cl_R& r) : quotient(q), remainder(r) {}
  158. cl_R_div_t (const struct cl_I_div_t &);
  159. cl_R_div_t (const struct cl_RA_div_t &);
  160. cl_R_div_t (const struct cl_F_div_t &);
  161. };
  162. // floor2(x) liefert (floor x), wo x eine reelle Zahl ist.
  163. extern const cl_R_div_t floor2 (const cl_R& x);
  164. extern const cl_I floor1 (const cl_R& x);
  165. // ceiling2(x) liefert (ceiling x), wo x eine reelle Zahl ist.
  166. extern const cl_R_div_t ceiling2 (const cl_R& x);
  167. extern const cl_I ceiling1 (const cl_R& x);
  168. // truncate2(x) liefert (truncate x), wo x eine reelle Zahl ist.
  169. extern const cl_R_div_t truncate2 (const cl_R& x);
  170. extern const cl_I truncate1 (const cl_R& x);
  171. // round2(x) liefert (round x), wo x eine reelle Zahl ist.
  172. extern const cl_R_div_t round2 (const cl_R& x);
  173. extern const cl_I round1 (const cl_R& x);
  174. // floor2(x,y) liefert (floor x y), wo x und y reelle Zahlen sind.
  175. extern const cl_R_div_t floor2 (const cl_R& x, const cl_R& y);
  176. extern const cl_I floor1 (const cl_R& x, const cl_R& y);
  177. // ceiling2(x,y) liefert (ceiling x y), wo x und y reelle Zahlen sind.
  178. extern const cl_R_div_t ceiling2 (const cl_R& x, const cl_R& y);
  179. extern const cl_I ceiling1 (const cl_R& x, const cl_R& y);
  180. // truncate2(x,y) liefert (truncate x y), wo x und y reelle Zahlen sind.
  181. extern const cl_R_div_t truncate2 (const cl_R& x, const cl_R& y);
  182. extern const cl_I truncate1 (const cl_R& x, const cl_R& y);
  183. // round2(x,y) liefert (round x y), wo x und y reelle Zahlen sind.
  184. extern const cl_R_div_t round2 (const cl_R& x, const cl_R& y);
  185. extern const cl_I round1 (const cl_R& x, const cl_R& y);
  186. // Return type for frounding operators.
  187. // x / y --> (q,r) with x = y*q+r.
  188. struct cl_R_fdiv_t {
  189. cl_F quotient;
  190. cl_R remainder;
  191. // Constructor.
  192. cl_R_fdiv_t () {}
  193. cl_R_fdiv_t (const cl_F& q, const cl_R& r) : quotient(q), remainder(r) {}
  194. cl_R_fdiv_t (const struct cl_F_fdiv_t &);
  195. };
  196. // ffloor2(x) liefert (ffloor x), wo x eine reelle Zahl ist.
  197. extern const cl_R_fdiv_t ffloor2 (const cl_R& x);
  198. extern const cl_F ffloor (const cl_R& x);
  199. // fceiling2(x) liefert (fceiling x), wo x eine reelle Zahl ist.
  200. extern const cl_R_fdiv_t fceiling2 (const cl_R& x);
  201. extern const cl_F fceiling (const cl_R& x);
  202. // ftruncate2(x) liefert (ftruncate x), wo x eine reelle Zahl ist.
  203. extern const cl_R_fdiv_t ftruncate2 (const cl_R& x);
  204. extern const cl_F ftruncate (const cl_R& x);
  205. // fround2(x) liefert (fround x), wo x eine reelle Zahl ist.
  206. extern const cl_R_fdiv_t fround2 (const cl_R& x);
  207. extern const cl_F fround (const cl_R& x);
  208. // ffloor2(x,y) liefert (ffloor x y), wo x und y reelle Zahlen sind.
  209. extern const cl_R_fdiv_t ffloor2 (const cl_R& x, const cl_R& y);
  210. extern const cl_F ffloor (const cl_R& x, const cl_R& y);
  211. // fceiling2(x,y) liefert (fceiling x y), wo x und y reelle Zahlen sind.
  212. extern const cl_R_fdiv_t fceiling2 (const cl_R& x, const cl_R& y);
  213. extern const cl_F fceiling (const cl_R& x, const cl_R& y);
  214. // ftruncate2(x,y) liefert (ftruncate x y), wo x und y reelle Zahlen sind.
  215. extern const cl_R_fdiv_t ftruncate2 (const cl_R& x, const cl_R& y);
  216. extern const cl_F ftruncate (const cl_R& x, const cl_R& y);
  217. // fround2(x,y) liefert (fround x y), wo x und y reelle Zahlen sind.
  218. extern const cl_R_fdiv_t fround2 (const cl_R& x, const cl_R& y);
  219. extern const cl_F fround (const cl_R& x, const cl_R& y);
  220. // mod(x,y) = (mod x y), wo x und y reelle Zahlen sind.
  221. extern const cl_R mod (const cl_R& x, const cl_R& y);
  222. // rem(x,y) = (rem x y), wo x und y reelle Zahlen sind.
  223. extern const cl_R rem (const cl_R& x, const cl_R& y);
  224. // rational(x) liefert (rational x), wo x eine reelle Zahl ist.
  225. extern const cl_RA rational (const cl_R& x);
  226. // Spezialfall:
  227. inline const cl_RA rational (const cl_RA& x) { return x; }
  228. // cl_equal(x,y) vergleicht zwei reelle Zahlen x und y auf Gleichheit.
  229. extern cl_boolean cl_equal (const cl_R& x, const cl_R& y);
  230. // cl_equal_hashcode(x) liefert einen cl_equal-invarianten Hashcode f�r x.
  231. extern uint32 cl_equal_hashcode (const cl_R& x);
  232. // cl_compare(x,y) vergleicht zwei reelle Zahlen x und y.
  233. // Ergebnis: 0 falls x=y, +1 falls x>y, -1 falls x<y.
  234. extern cl_signean cl_compare (const cl_R& x, const cl_R& y);
  235. inline bool operator== (const cl_R& x, const cl_R& y)
  236. { return cl_equal(x,y); }
  237. inline bool operator!= (const cl_R& x, const cl_R& y)
  238. { return !cl_equal(x,y); }
  239. inline bool operator<= (const cl_R& x, const cl_R& y)
  240. { return cl_compare(x,y)<=0; }
  241. inline bool operator< (const cl_R& x, const cl_R& y)
  242. { return cl_compare(x,y)<0; }
  243. inline bool operator>= (const cl_R& x, const cl_R& y)
  244. { return cl_compare(x,y)>=0; }
  245. inline bool operator> (const cl_R& x, const cl_R& y)
  246. { return cl_compare(x,y)>0; }
  247. // max(x,y) liefert (max x y), wo x und y reelle Zahlen sind.
  248. extern const cl_R max (const cl_R& x, const cl_R& y);
  249. // min(x,y) liefert (min x y), wo x und y reelle Zahlen sind.
  250. extern const cl_R min (const cl_R& x, const cl_R& y);
  251. // signum(x) liefert (signum x), wo x eine reelle Zahl ist.
  252. extern const cl_R signum (const cl_R& x);
  253. // sqrt(x) = (sqrt x) zieht die Wurzel aus einer reellen Zahl x >=0.
  254. extern const cl_R sqrt (const cl_R& x);
  255. // sqrt(x) = (sqrt x) zieht die Wurzel aus einer rationalen Zahl x >=0.
  256. extern const cl_R sqrt (const cl_RA& x);
  257. // (expt x y), wo x eine reelle Zahl und y ein Integer ist.
  258. extern const cl_R expt (const cl_R& x, sintL y);
  259. extern const cl_R expt (const cl_R& x, const cl_I& y);
  260. // rationalize(x) liefert (rationalize x), wo x eine reelle Zahl ist.
  261. extern const cl_RA rationalize (const cl_R& x);
  262. // Konversion zu einem C "float".
  263. extern float cl_float_approx (const cl_R& x);
  264. // Konversion zu einem C "double".
  265. extern double cl_double_approx (const cl_R& x);
  266. // Transcendental functions
  267. // atan(x,y) liefert zu zwei reellen Zahlen x, y den Winkel von (x,y)
  268. // in Polarkoordinaten. Ergebnis rational nur, wenn x>0 und y=0.
  269. extern const cl_R atan (const cl_R& x, const cl_R& y);
  270. // Spezialfall: y Float -> Ergebnis Float
  271. inline const cl_F atan (const cl_R& x, const cl_F& y)
  272. { return The(cl_F)(atan(x,The(cl_R)(y))); }
  273. // Dem C++-Compiler mu� man nun auch das Folgende sagen:
  274. inline const cl_R atan (const cl_R& x, const int y)
  275. { return atan(x,cl_I(y)); }
  276. inline const cl_R atan (const cl_R& x, const unsigned int y)
  277. { return atan(x,cl_I(y)); }
  278. inline const cl_R atan (const cl_R& x, const long y)
  279. { return atan(x,cl_I(y)); }
  280. inline const cl_R atan (const cl_R& x, const unsigned long y)
  281. { return atan(x,cl_I(y)); }
  282. // atan(x) liefert den Arctan einer reellen Zahl x.
  283. // Ergebnis rational nur, wenn x=0.
  284. extern const cl_R atan (const cl_R& x);
  285. // Spezialfall: x Float -> Ergebnis Float
  286. inline const cl_F atan (const cl_F& x) { return The(cl_F)(atan(The(cl_R)(x))); }
  287. // Dem C++-Compiler mu� man nun auch das Folgende sagen:
  288. inline const cl_R atan (const int x) { return atan(cl_I(x)); }
  289. inline const cl_R atan (const unsigned int x) { return atan(cl_I(x)); }
  290. inline const cl_R atan (const long x) { return atan(cl_I(x)); }
  291. inline const cl_R atan (const unsigned long x) { return atan(cl_I(x)); }
  292. // sin(x) liefert den Sinus (sin x) einer reellen Zahl x.
  293. extern const cl_R sin (const cl_R& x);
  294. // Dem C++-Compiler mu� man nun auch das Folgende sagen:
  295. inline const cl_R sin (const int x) { return sin(cl_I(x)); }
  296. inline const cl_R sin (const unsigned int x) { return sin(cl_I(x)); }
  297. inline const cl_R sin (const long x) { return sin(cl_I(x)); }
  298. inline const cl_R sin (const unsigned long x) { return sin(cl_I(x)); }
  299. // cos(x) liefert den Cosinus (cos x) einer reellen Zahl x.
  300. extern const cl_R cos (const cl_R& x);
  301. // Dem C++-Compiler mu� man nun auch das Folgende sagen:
  302. inline const cl_R cos (const int x) { return cos(cl_I(x)); }
  303. inline const cl_R cos (const unsigned int x) { return cos(cl_I(x)); }
  304. inline const cl_R cos (const long x) { return cos(cl_I(x)); }
  305. inline const cl_R cos (const unsigned long x) { return cos(cl_I(x)); }
  306. // cl_cos_sin(x) liefert ((cos x),(sin x)), beide Werte.
  307. extern const cl_cos_sin_t cl_cos_sin (const cl_R& x);
  308. // tan(x) liefert den Tangens (tan x) einer reellen Zahl x.
  309. extern const cl_R tan (const cl_R& x);
  310. // Dem C++-Compiler mu� man nun auch das Folgende sagen:
  311. inline const cl_R tan (const int x) { return tan(cl_I(x)); }
  312. inline const cl_R tan (const unsigned int x) { return tan(cl_I(x)); }
  313. inline const cl_R tan (const long x) { return tan(cl_I(x)); }
  314. inline const cl_R tan (const unsigned long x) { return tan(cl_I(x)); }
  315. // ln(x) liefert zu einer reellen Zahl x>0 die Zahl ln(x).
  316. extern const cl_R ln (const cl_R& x);
  317. // Dem C++-Compiler mu� man nun auch das Folgende sagen:
  318. inline const cl_R ln (const int x) { return ln(cl_I(x)); }
  319. inline const cl_R ln (const unsigned int x) { return ln(cl_I(x)); }
  320. inline const cl_R ln (const long x) { return ln(cl_I(x)); }
  321. inline const cl_R ln (const unsigned long x) { return ln(cl_I(x)); }
  322. // log(a,b) liefert zu reellen Zahlen a>0, b>0 die Zahl
  323. // log(a,b)=ln(a)/ln(b).
  324. // Ergebnis rational nur, wenn a=1 oder a und b rational.
  325. extern const cl_R log (const cl_R& a, const cl_R& b);
  326. // exp(x) liefert zu einer reellen Zahl x die Zahl exp(x).
  327. extern const cl_R exp (const cl_R& x);
  328. // Dem C++-Compiler mu� man nun auch das Folgende sagen:
  329. inline const cl_R exp (const int x) { return exp(cl_I(x)); }
  330. inline const cl_R exp (const unsigned int x) { return exp(cl_I(x)); }
  331. inline const cl_R exp (const long x) { return exp(cl_I(x)); }
  332. inline const cl_R exp (const unsigned long x) { return exp(cl_I(x)); }
  333. // sinh(x) liefert zu einer reellen Zahl x die Zahl sinh(x).
  334. extern const cl_R sinh (const cl_R& x);
  335. // Dem C++-Compiler mu� man nun auch das Folgende sagen:
  336. inline const cl_R sinh (const int x) { return sinh(cl_I(x)); }
  337. inline const cl_R sinh (const unsigned int x) { return sinh(cl_I(x)); }
  338. inline const cl_R sinh (const long x) { return sinh(cl_I(x)); }
  339. inline const cl_R sinh (const unsigned long x) { return sinh(cl_I(x)); }
  340. // cosh(x) liefert zu einer reellen Zahl x die Zahl cosh(x).
  341. extern const cl_R cosh (const cl_R& x);
  342. // Dem C++-Compiler mu� man nun auch das Folgende sagen:
  343. inline const cl_R cosh (const int x) { return cosh(cl_I(x)); }
  344. inline const cl_R cosh (const unsigned int x) { return cosh(cl_I(x)); }
  345. inline const cl_R cosh (const long x) { return cosh(cl_I(x)); }
  346. inline const cl_R cosh (const unsigned long x) { return cosh(cl_I(x)); }
  347. // cl_cosh_sinh(x) liefert ((cosh x),(sinh x)), beide Werte.
  348. extern const cl_cosh_sinh_t cl_cosh_sinh (const cl_R& x);
  349. // tanh(x) liefert zu einer reellen Zahl x die Zahl tanh(x).
  350. extern const cl_R tanh (const cl_R& x);
  351. // Dem C++-Compiler mu� man nun auch das Folgende sagen:
  352. inline const cl_R tanh (const int x) { return tanh(cl_I(x)); }
  353. inline const cl_R tanh (const unsigned int x) { return tanh(cl_I(x)); }
  354. inline const cl_R tanh (const long x) { return tanh(cl_I(x)); }
  355. inline const cl_R tanh (const unsigned long x) { return tanh(cl_I(x)); }
  356. // random_R(randomstate,n) liefert zu einer reellen Zahl n>0 eine Zufallszahl
  357. // x mit 0 <= x < n.
  358. extern const cl_R random_R (cl_random_state& randomstate, const cl_R& n);
  359. inline const cl_R random_R (const cl_R& n)
  360. { return random_R(cl_default_random_state,n); }
  361. #ifdef WANT_OBFUSCATING_OPERATORS
  362. // This could be optimized to use in-place operations.
  363. inline cl_R& operator+= (cl_R& x, const cl_R& y) { return x = x + y; }
  364. inline cl_F& operator+= (cl_F& x, const cl_R& y) { return x = x + y; }
  365. inline cl_F& operator+= (cl_F& x, const cl_RA& y) { return x = x + y; }
  366. inline cl_F& operator+= (cl_F& x, const cl_I& y) { return x = x + y; }
  367. inline cl_R& operator+= (cl_R& x, const int y) { return x = x + y; }
  368. inline cl_R& operator+= (cl_R& x, const unsigned int y) { return x = x + y; }
  369. inline cl_R& operator+= (cl_R& x, const long y) { return x = x + y; }
  370. inline cl_R& operator+= (cl_R& x, const unsigned long y) { return x = x + y; }
  371. inline cl_F& operator+= (cl_F& x, const int y) { return x = x + y; }
  372. inline cl_F& operator+= (cl_F& x, const unsigned int y) { return x = x + y; }
  373. inline cl_F& operator+= (cl_F& x, const long y) { return x = x + y; }
  374. inline cl_F& operator+= (cl_F& x, const unsigned long y) { return x = x + y; }
  375. inline cl_R& operator++ /* prefix */ (cl_R& x) { return x = plus1(x); }
  376. inline void operator++ /* postfix */ (cl_R& x, int dummy) { (void)dummy; x = plus1(x); }
  377. inline cl_R& operator-= (cl_R& x, const cl_R& y) { return x = x - y; }
  378. inline cl_F& operator-= (cl_F& x, const cl_R& y) { return x = x - y; }
  379. inline cl_F& operator-= (cl_F& x, const cl_RA& y) { return x = x - y; }
  380. inline cl_F& operator-= (cl_F& x, const cl_I& y) { return x = x - y; }
  381. inline cl_R& operator-= (cl_R& x, const int y) { return x = x - y; }
  382. inline cl_R& operator-= (cl_R& x, const unsigned int y) { return x = x - y; }
  383. inline cl_R& operator-= (cl_R& x, const long y) { return x = x - y; }
  384. inline cl_R& operator-= (cl_R& x, const unsigned long y) { return x = x - y; }
  385. inline cl_F& operator-= (cl_F& x, const int y) { return x = x - y; }
  386. inline cl_F& operator-= (cl_F& x, const unsigned int y) { return x = x - y; }
  387. inline cl_F& operator-= (cl_F& x, const long y) { return x = x - y; }
  388. inline cl_F& operator-= (cl_F& x, const unsigned long y) { return x = x - y; }
  389. inline cl_R& operator-- /* prefix */ (cl_R& x) { return x = minus1(x); }
  390. inline void operator-- /* postfix */ (cl_R& x, int dummy) { (void)dummy; x = minus1(x); }
  391. inline cl_R& operator*= (cl_R& x, const cl_R& y) { return x = x * y; }
  392. inline cl_R& operator/= (cl_R& x, const cl_R& y) { return x = x / y; }
  393. inline cl_F& operator/= (cl_F& x, const cl_R& y) { return x = x / y; }
  394. inline cl_F& operator/= (cl_F& x, const cl_RA& y) { return x = x / y; }
  395. inline cl_F& operator/= (cl_F& x, const cl_I& y) { return x = x / y; }
  396. inline cl_R& operator/= (cl_R& x, const int y) { return x = x / y; }
  397. inline cl_R& operator/= (cl_R& x, const unsigned int y) { return x = x / y; }
  398. inline cl_R& operator/= (cl_R& x, const long y) { return x = x / y; }
  399. inline cl_R& operator/= (cl_R& x, const unsigned long y) { return x = x / y; }
  400. inline cl_F& operator/= (cl_F& x, const int y) { return x = x / y; }
  401. inline cl_F& operator/= (cl_F& x, const unsigned int y) { return x = x / y; }
  402. inline cl_F& operator/= (cl_F& x, const long y) { return x = x / y; }
  403. inline cl_F& operator/= (cl_F& x, const unsigned long y) { return x = x / y; }
  404. #endif
  405. // Complex operations, trivial for reals
  406. inline const cl_R realpart (const cl_R& x)
  407. {
  408. return x;
  409. }
  410. inline const cl_R imagpart (const cl_R& x)
  411. {
  412. (void)x; // unused x
  413. return 0;
  414. }
  415. inline const cl_R conjugate (const cl_R& x)
  416. {
  417. return x;
  418. }
  419. // Debugging support.
  420. #ifdef CL_DEBUG
  421. extern int cl_R_debug_module;
  422. static void* const cl_R_debug_dummy[] = { &cl_R_debug_dummy,
  423. &cl_R_debug_module
  424. };
  425. #endif
  426. #endif /* _CL_REAL_H */