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.

655 lines
22 KiB

25 years ago
  1. // Public float operations.
  2. #ifndef _CL_FLOAT_H
  3. #define _CL_FLOAT_H
  4. #include "cl_number.h"
  5. #include "cl_float_class.h"
  6. #include "cl_floatformat.h"
  7. #include "cl_random.h"
  8. #include "cl_integer_class.h"
  9. #include "cl_sfloat_class.h"
  10. #include "cl_ffloat_class.h"
  11. #include "cl_dfloat_class.h"
  12. #include "cl_lfloat_class.h"
  13. CL_DEFINE_AS_CONVERSION(cl_F)
  14. // Return type for integer_decode_float:
  15. struct cl_idecoded_float {
  16. cl_I mantissa;
  17. cl_I exponent;
  18. cl_I sign;
  19. // Constructor.
  20. cl_idecoded_float () {}
  21. cl_idecoded_float (const cl_I& m, const cl_I& e, const cl_I& s) : mantissa(m), exponent(e), sign(s) {}
  22. };
  23. // zerop(x) testet, ob (= x 0).
  24. extern cl_boolean zerop (const cl_F& x);
  25. // minusp(x) testet, ob (< x 0).
  26. extern cl_boolean minusp (const cl_F& x);
  27. // plusp(x) testet, ob (> x 0).
  28. extern cl_boolean plusp (const cl_F& x);
  29. // cl_F_to_SF(x) wandelt ein Float x in ein Short-Float um und rundet dabei.
  30. extern const cl_SF cl_F_to_SF (const cl_F& x);
  31. // cl_F_to_FF(x) wandelt ein Float x in ein Single-Float um und rundet dabei.
  32. extern const cl_FF cl_F_to_FF (const cl_F& x);
  33. // cl_F_to_DF(x) wandelt ein Float x in ein Double-Float um und rundet dabei.
  34. extern const cl_DF cl_F_to_DF (const cl_F& x);
  35. // cl_F_to_LF(x,len) wandelt ein Float x in ein Long-Float mit len Digits um
  36. // und rundet dabei.
  37. // > uintC len: gew�nschte Anzahl Digits, >=LF_minlen
  38. extern const cl_LF cl_F_to_LF (const cl_F& x, uintC len);
  39. // The default float format used when converting rational numbers to floats.
  40. extern cl_float_format_t cl_default_float_format;
  41. // Returns the smallest float format which guarantees at least n decimal digits
  42. // in the mantissa (after the decimal point).
  43. extern cl_float_format_t cl_float_format (uintL n);
  44. // cl_float(x,y) wandelt ein Float x in das Float-Format des Floats y um
  45. // und rundet dabei n�tigenfalls.
  46. // > x,y: Floats
  47. // < ergebnis: (float x y)
  48. extern const cl_F cl_float (const cl_F& x, const cl_F& y);
  49. // cl_float(x,f) wandelt ein Float x in das Float-Format f um
  50. // und rundet dabei n�tigenfalls.
  51. // > x: ein Float
  52. // > f: eine Float-Format-Spezifikation
  53. // < ergebnis: (float x f)
  54. extern const cl_F cl_float (const cl_F& x, cl_float_format_t f);
  55. // cl_float(x) wandelt eine reelle Zahl x in ein Float um
  56. // und rundet dabei n�tigenfalls.
  57. // > x: eine reelle Zahl
  58. // < ergebnis: (float x)
  59. // Abh�ngig von cl_default_float_format.
  60. inline const cl_F cl_float (const cl_F& x) { return x; }
  61. // cl_float(x,y) wandelt ein Integer x in das Float-Format des Floats y um
  62. // und rundet dabei n�tigenfalls.
  63. // > x: ein Integer
  64. // > y: ein Float
  65. // < ergebnis: (float x y)
  66. extern const cl_F cl_float (const cl_I& x, const cl_F& y);
  67. // cl_float(x,y) wandelt ein Integer x in das Float-Format f um
  68. // und rundet dabei n�tigenfalls.
  69. // > x: ein Integer
  70. // > f: eine Float-Format-Spezifikation
  71. // < ergebnis: (float x f)
  72. extern const cl_F cl_float (const cl_I& x, cl_float_format_t f);
  73. // cl_float(x) wandelt ein Integer x in ein Float um und rundet dabei.
  74. // > x: ein Integer
  75. // < ergebnis: (float x)
  76. // Abh�ngig von cl_default_float_format.
  77. extern const cl_F cl_float (const cl_I& x);
  78. // cl_float(x,y) wandelt eine rationale Zahl x in das Float-Format des
  79. // Floats y um und rundet dabei n�tigenfalls.
  80. // > x: eine rationale Zahl
  81. // > y: ein Float
  82. // < ergebnis: (float x y)
  83. extern const cl_F cl_float (const cl_RA& x, const cl_F& y);
  84. // cl_float(x,y) wandelt eine rationale Zahl x in das Float-Format f um
  85. // und rundet dabei n�tigenfalls.
  86. // > x: eine rationale Zahl
  87. // > f: eine Float-Format-Spezifikation
  88. // < ergebnis: (float x f)
  89. extern const cl_F cl_float (const cl_RA& x, cl_float_format_t f);
  90. // cl_float(x) wandelt eine rationale Zahl x in ein Float um und rundet dabei.
  91. // > x: eine rationale Zahl
  92. // < ergebnis: (float x)
  93. // Abh�ngig von cl_default_float_format.
  94. extern const cl_F cl_float (const cl_RA& x);
  95. // The C++ compilers are not clever enough to guess this:
  96. inline const cl_F cl_float (int x, const cl_F& y)
  97. { return cl_float(cl_I(x),y); }
  98. inline const cl_F cl_float (unsigned int x, const cl_F& y)
  99. { return cl_float(cl_I(x),y); }
  100. inline const cl_F cl_float (int x, cl_float_format_t y)
  101. { return cl_float(cl_I(x),y); }
  102. inline const cl_F cl_float (unsigned int x, cl_float_format_t y)
  103. { return cl_float(cl_I(x),y); }
  104. inline const cl_F cl_float (int x)
  105. { return cl_float(cl_I(x)); }
  106. inline const cl_F cl_float (unsigned int x)
  107. { return cl_float(cl_I(x)); }
  108. // The C++ compilers could hardly guess the following:
  109. inline const cl_F cl_float (float x, const cl_F& y)
  110. { return cl_float(cl_FF(x),y); }
  111. inline const cl_F cl_float (double x, const cl_F& y)
  112. { return cl_float(cl_DF(x),y); }
  113. inline const cl_F cl_float (float x, cl_float_format_t y)
  114. { return cl_float(cl_FF(x),y); }
  115. inline const cl_F cl_float (double x, cl_float_format_t y)
  116. { return cl_float(cl_DF(x),y); }
  117. inline const cl_F cl_float (float x)
  118. { return cl_float(cl_FF(x)); }
  119. inline const cl_F cl_float (double x)
  120. { return cl_float(cl_DF(x)); }
  121. // Liefert (- x), wo x ein Float ist.
  122. extern const cl_F operator- (const cl_F& x);
  123. // Liefert (+ x y), wo x und y Floats sind.
  124. extern const cl_F operator+ (const cl_F& x, const cl_F& y);
  125. // The C++ compilers could hardly guess the following:
  126. inline const cl_F operator+ (const cl_RA& x, const cl_F& y)
  127. { return cl_float(x,y) + y; }
  128. inline const cl_F operator+ (const cl_I& x, const cl_F& y)
  129. { return cl_float(x,y) + y; }
  130. inline const cl_F operator+ (const cl_F& x, const cl_RA& y)
  131. { return x + cl_float(y,x); }
  132. inline const cl_F operator+ (const cl_F& x, const cl_I& y)
  133. { return x + cl_float(y,x); }
  134. // Dem C++-Compiler mu� man nun auch das Folgende sagen:
  135. inline const cl_F operator+ (const int x, const cl_F& y)
  136. { return cl_I(x) + y; }
  137. inline const cl_F operator+ (const unsigned int x, const cl_F& y)
  138. { return cl_I(x) + y; }
  139. inline const cl_F operator+ (const long x, const cl_F& y)
  140. { return cl_I(x) + y; }
  141. inline const cl_F operator+ (const unsigned long x, const cl_F& y)
  142. { return cl_I(x) + y; }
  143. inline const cl_F operator+ (const cl_F& x, const int y)
  144. { return x + cl_I(y); }
  145. inline const cl_F operator+ (const cl_F& x, const unsigned int y)
  146. { return x + cl_I(y); }
  147. inline const cl_F operator+ (const cl_F& x, const long y)
  148. { return x + cl_I(y); }
  149. inline const cl_F operator+ (const cl_F& x, const unsigned long y)
  150. { return x + cl_I(y); }
  151. // Liefert (- x y), wo x und y Floats sind.
  152. extern const cl_F operator- (const cl_F& x, const cl_F& y);
  153. // The C++ compilers could hardly guess the following:
  154. inline const cl_F operator- (const cl_RA& x, const cl_F& y)
  155. { return cl_float(x,y) - y; }
  156. inline const cl_F operator- (const cl_I& x, const cl_F& y)
  157. { return cl_float(x,y) - y; }
  158. inline const cl_F operator- (const cl_F& x, const cl_RA& y)
  159. { return x - cl_float(y,x); }
  160. inline const cl_F operator- (const cl_F& x, const cl_I& y)
  161. { return x - cl_float(y,x); }
  162. // Dem C++-Compiler mu� man nun auch das Folgende sagen:
  163. inline const cl_F operator- (const int x, const cl_F& y)
  164. { return cl_I(x) - y; }
  165. inline const cl_F operator- (const unsigned int x, const cl_F& y)
  166. { return cl_I(x) - y; }
  167. inline const cl_F operator- (const long x, const cl_F& y)
  168. { return cl_I(x) - y; }
  169. inline const cl_F operator- (const unsigned long x, const cl_F& y)
  170. { return cl_I(x) - y; }
  171. inline const cl_F operator- (const cl_F& x, const int y)
  172. { return x - cl_I(y); }
  173. inline const cl_F operator- (const cl_F& x, const unsigned int y)
  174. { return x - cl_I(y); }
  175. inline const cl_F operator- (const cl_F& x, const long y)
  176. { return x - cl_I(y); }
  177. inline const cl_F operator- (const cl_F& x, const unsigned long y)
  178. { return x - cl_I(y); }
  179. // Liefert (* x y), wo x und y Floats sind.
  180. extern const cl_F operator* (const cl_F& x, const cl_F& y);
  181. // Spezialfall x oder y Integer oder rationale Zahl.
  182. inline const cl_R operator* (const cl_F& x, const cl_I& y)
  183. {
  184. extern const cl_R cl_F_I_mul (const cl_F&, const cl_I&);
  185. return cl_F_I_mul(x,y);
  186. }
  187. inline const cl_R operator* (const cl_I& x, const cl_F& y)
  188. {
  189. extern const cl_R cl_F_I_mul (const cl_F&, const cl_I&);
  190. return cl_F_I_mul(y,x);
  191. }
  192. inline const cl_R operator* (const cl_F& x, const cl_RA& y)
  193. {
  194. extern const cl_R cl_F_RA_mul (const cl_F&, const cl_RA&);
  195. return cl_F_RA_mul(x,y);
  196. }
  197. inline const cl_R operator* (const cl_RA& x, const cl_F& y)
  198. {
  199. extern const cl_R cl_F_RA_mul (const cl_F&, const cl_RA&);
  200. return cl_F_RA_mul(y,x);
  201. }
  202. // Dem C++-Compiler mu� man nun auch das Folgende sagen:
  203. inline const cl_R operator* (const int x, const cl_F& y)
  204. { return cl_I(x) * y; }
  205. inline const cl_R operator* (const unsigned int x, const cl_F& y)
  206. { return cl_I(x) * y; }
  207. inline const cl_R operator* (const long x, const cl_F& y)
  208. { return cl_I(x) * y; }
  209. inline const cl_R operator* (const unsigned long x, const cl_F& y)
  210. { return cl_I(x) * y; }
  211. inline const cl_R operator* (const cl_F& x, const int y)
  212. { return x * cl_I(y); }
  213. inline const cl_R operator* (const cl_F& x, const unsigned int y)
  214. { return x * cl_I(y); }
  215. inline const cl_R operator* (const cl_F& x, const long y)
  216. { return x * cl_I(y); }
  217. inline const cl_R operator* (const cl_F& x, const unsigned long y)
  218. { return x * cl_I(y); }
  219. // Liefert (* x x), wo x ein Float ist.
  220. extern const cl_F square (const cl_F& x);
  221. // Liefert (/ x y), wo x und y Floats sind.
  222. extern const cl_F operator/ (const cl_F& x, const cl_F& y);
  223. // Liefert (/ x y), wo x und y ein Float und eine rationale Zahl sind.
  224. extern const cl_F operator/ (const cl_F& x, const cl_RA& y);
  225. extern const cl_F operator/ (const cl_F& x, const cl_I& y);
  226. extern const cl_R operator/ (const cl_RA& x, const cl_F& y);
  227. extern const cl_R operator/ (const cl_I& x, const cl_F& y);
  228. // The C++ compilers could hardly guess the following:
  229. inline const cl_F operator/ (const cl_F& x, const int y)
  230. { return x / cl_I(y); }
  231. inline const cl_F operator/ (const cl_F& x, const unsigned int y)
  232. { return x / cl_I(y); }
  233. inline const cl_F operator/ (const cl_F& x, const long y)
  234. { return x / cl_I(y); }
  235. inline const cl_F operator/ (const cl_F& x, const unsigned long y)
  236. { return x / cl_I(y); }
  237. inline const cl_R operator/ (const int x, const cl_F& y)
  238. { return cl_I(x) / y; }
  239. inline const cl_R operator/ (const unsigned int x, const cl_F& y)
  240. { return cl_I(x) / y; }
  241. inline const cl_R operator/ (const long x, const cl_F& y)
  242. { return cl_I(x) / y; }
  243. inline const cl_R operator/ (const unsigned long x, const cl_F& y)
  244. { return cl_I(x) / y; }
  245. // Liefert (abs x), wo x ein Float ist.
  246. extern const cl_F abs (const cl_F& x);
  247. // Liefert zu einem Float x>=0 : (sqrt x), ein Float.
  248. extern const cl_F sqrt (const cl_F& x);
  249. // recip(x) liefert (/ x), wo x ein Float ist.
  250. extern const cl_F recip (const cl_F& x);
  251. // (1+ x), wo x ein Float ist.
  252. inline const cl_F plus1 (const cl_F& x) // { return x + cl_I(1); }
  253. {
  254. return x + cl_float(1,x);
  255. }
  256. // (1- x), wo x ein Float ist.
  257. inline const cl_F minus1 (const cl_F& x) // { return x + cl_I(-1); }
  258. {
  259. return x + cl_float(-1,x);
  260. }
  261. // cl_compare(x,y) vergleicht zwei Floats x und y.
  262. // Ergebnis: 0 falls x=y, +1 falls x>y, -1 falls x<y.
  263. extern cl_signean cl_compare (const cl_F& x, const cl_F& y);
  264. // cl_equal_hashcode(x) liefert einen cl_equal-invarianten Hashcode f�r x.
  265. extern uint32 cl_equal_hashcode (const cl_F& x);
  266. inline bool operator== (const cl_F& x, const cl_F& y)
  267. { return cl_compare(x,y)==0; }
  268. inline bool operator!= (const cl_F& x, const cl_F& y)
  269. { return cl_compare(x,y)!=0; }
  270. inline bool operator<= (const cl_F& x, const cl_F& y)
  271. { return cl_compare(x,y)<=0; }
  272. inline bool operator< (const cl_F& x, const cl_F& y)
  273. { return cl_compare(x,y)<0; }
  274. inline bool operator>= (const cl_F& x, const cl_F& y)
  275. { return cl_compare(x,y)>=0; }
  276. inline bool operator> (const cl_F& x, const cl_F& y)
  277. { return cl_compare(x,y)>0; }
  278. // ffloor(x) liefert (ffloor x), wo x ein Float ist.
  279. extern const cl_F ffloor (const cl_F& x);
  280. // fceiling(x) liefert (fceiling x), wo x ein Float ist.
  281. extern const cl_F fceiling (const cl_F& x);
  282. // ftruncate(x) liefert (ftruncate x), wo x ein Float ist.
  283. extern const cl_F ftruncate (const cl_F& x);
  284. // fround(x) liefert (fround x), wo x ein Float ist.
  285. extern const cl_F fround (const cl_F& x);
  286. // Return type for frounding operators.
  287. // x / y --> (q,r) with x = y*q+r.
  288. struct cl_F_fdiv_t {
  289. cl_F quotient;
  290. cl_F remainder;
  291. // Constructor.
  292. cl_F_fdiv_t () {}
  293. cl_F_fdiv_t (const cl_F& q, const cl_F& r) : quotient(q), remainder(r) {}
  294. };
  295. // ffloor2(x) liefert (ffloor x), wo x ein F ist.
  296. extern const cl_F_fdiv_t ffloor2 (const cl_F& x);
  297. // fceiling2(x) liefert (fceiling x), wo x ein F ist.
  298. extern const cl_F_fdiv_t fceiling2 (const cl_F& x);
  299. // ftruncate2(x) liefert (ftruncate x), wo x ein F ist.
  300. extern const cl_F_fdiv_t ftruncate2 (const cl_F& x);
  301. // fround2(x) liefert (fround x), wo x ein F ist.
  302. extern const cl_F_fdiv_t fround2 (const cl_F& x);
  303. // Return type for rounding operators.
  304. // x / y --> (q,r) with x = y*q+r.
  305. struct cl_F_div_t {
  306. cl_I quotient;
  307. cl_F remainder;
  308. // Constructor.
  309. cl_F_div_t () {}
  310. cl_F_div_t (const cl_I& q, const cl_F& r) : quotient(q), remainder(r) {}
  311. };
  312. // floor2(x) liefert (floor x), wo x ein F ist.
  313. extern const cl_F_div_t floor2 (const cl_F& x);
  314. extern const cl_I floor1 (const cl_F& x);
  315. // ceiling2(x) liefert (ceiling x), wo x ein F ist.
  316. extern const cl_F_div_t ceiling2 (const cl_F& x);
  317. extern const cl_I ceiling1 (const cl_F& x);
  318. // truncate2(x) liefert (truncate x), wo x ein F ist.
  319. extern const cl_F_div_t truncate2 (const cl_F& x);
  320. extern const cl_I truncate1 (const cl_F& x);
  321. // round2(x) liefert (round x), wo x ein F ist.
  322. extern const cl_F_div_t round2 (const cl_F& x);
  323. extern const cl_I round1 (const cl_F& x);
  324. // floor2(x,y) liefert (floor x y), wo x und y Floats sind.
  325. extern const cl_F_div_t floor2 (const cl_F& x, const cl_F& y);
  326. inline const cl_I floor1 (const cl_F& x, const cl_F& y) { return floor1(x/y); }
  327. // ceiling2(x,y) liefert (ceiling x y), wo x und y Floats sind.
  328. extern const cl_F_div_t ceiling2 (const cl_F& x, const cl_F& y);
  329. inline const cl_I ceiling1 (const cl_F& x, const cl_F& y) { return ceiling1(x/y); }
  330. // truncate2(x,y) liefert (truncate x y), wo x und y Floats sind.
  331. extern const cl_F_div_t truncate2 (const cl_F& x, const cl_F& y);
  332. inline const cl_I truncate1 (const cl_F& x, const cl_F& y) { return truncate1(x/y); }
  333. // round2(x,y) liefert (round x y), wo x und y Floats sind.
  334. extern const cl_F_div_t round2 (const cl_F& x, const cl_F& y);
  335. inline const cl_I round1 (const cl_F& x, const cl_F& y) { return round1(x/y); }
  336. // Return type for decode_float:
  337. struct cl_decoded_float {
  338. cl_F mantissa;
  339. cl_I exponent;
  340. cl_F sign;
  341. // Constructor.
  342. cl_decoded_float () {}
  343. cl_decoded_float (const cl_F& m, const cl_I& e, const cl_F& s) : mantissa(m), exponent(e), sign(s) {}
  344. };
  345. // decode_float(x) liefert zu einem Float x: (decode-float x).
  346. // x = 0.0 liefert (0.0, 0, 1.0).
  347. // x = (-1)^s * 2^e * m liefert ((-1)^0 * 2^0 * m, e als Integer, (-1)^s).
  348. extern const cl_decoded_float decode_float (const cl_F& x);
  349. // float_exponent(x) liefert zu einem Float x:
  350. // den Exponenten von (decode-float x).
  351. // x = 0.0 liefert 0.
  352. // x = (-1)^s * 2^e * m liefert e.
  353. extern sintL float_exponent (const cl_F& x);
  354. // float_radix(x) liefert (float-radix x), wo x ein Float ist.
  355. inline sintL float_radix (const cl_F& x)
  356. {
  357. (void)x; // unused x
  358. return 2;
  359. }
  360. // float_sign(x) liefert (float-sign x), wo x ein Float ist.
  361. extern const cl_F float_sign (const cl_F& x);
  362. // float_sign(x,y) liefert (float-sign x y), wo x und y Floats sind.
  363. extern const cl_F float_sign (const cl_F& x, const cl_F& y);
  364. // float_digits(x) liefert (float-digits x), wo x ein Float ist.
  365. // < ergebnis: ein uintL >0
  366. extern uintL float_digits (const cl_F& x);
  367. // float_precision(x) liefert (float-precision x), wo x ein Float ist.
  368. // < ergebnis: ein uintL >=0
  369. extern uintL float_precision (const cl_F& x);
  370. // Returns the floating point format of a float.
  371. inline cl_float_format_t cl_float_format (const cl_F& x)
  372. { return (cl_float_format_t) float_digits(x); }
  373. // integer_decode_float(x) liefert zu einem Float x: (integer-decode-float x).
  374. // x = 0.0 liefert (0, 0, 1).
  375. // x = (-1)^s * 2^e * m bei Float-Precision p liefert
  376. // (Mantisse 2^p * m als Integer, e-p als Integer, (-1)^s als Fixnum).
  377. extern const cl_idecoded_float integer_decode_float (const cl_F& x);
  378. // rational(x) liefert (rational x), wo x ein Float ist.
  379. extern const cl_RA rational (const cl_F& x);
  380. // scale_float(x,delta) liefert x*2^delta, wo x ein Float ist.
  381. extern const cl_F scale_float (const cl_F& x, sintL delta);
  382. extern const cl_F scale_float (const cl_F& x, const cl_I& delta);
  383. // max(x,y) liefert (max x y), wo x und y Floats sind.
  384. extern const cl_F max (const cl_F& x, const cl_F& y);
  385. // min(x,y) liefert (min x y), wo x und y Floats sind.
  386. extern const cl_F min (const cl_F& x, const cl_F& y);
  387. // signum(x) liefert (signum x), wo x ein Float ist.
  388. extern const cl_F signum (const cl_F& x);
  389. // Returns the largest (most positive) floating point number in float format f.
  390. extern const cl_F most_positive_float (cl_float_format_t f);
  391. //CL_REQUIRE(cl_F_mostpos)
  392. // Returns the smallest (most negative) floating point number in float format f.
  393. extern const cl_F most_negative_float (cl_float_format_t f);
  394. //CL_REQUIRE(cl_F_mostneg)
  395. // Returns the least positive floating point number (i.e. > 0 but closest to 0)
  396. // in float format f.
  397. extern const cl_F least_positive_float (cl_float_format_t f);
  398. //CL_REQUIRE(cl_F_leastpos)
  399. // Returns the least negative floating point number (i.e. < 0 but closest to 0)
  400. // in float format f.
  401. extern const cl_F least_negative_float (cl_float_format_t f);
  402. //CL_REQUIRE(cl_F_leastneg)
  403. // Returns the smallest floating point number e > 0 such that 1+e != 1.
  404. extern const cl_F float_epsilon (cl_float_format_t f);
  405. //CL_REQUIRE(cl_F_epspos)
  406. // Returns the smallest floating point number e > 0 such that 1-e != 1.
  407. extern const cl_F float_negative_epsilon (cl_float_format_t f);
  408. //CL_REQUIRE(cl_F_epsneg)
  409. // Konversion zu einem C "float".
  410. extern float cl_float_approx (const cl_F& x);
  411. // Konversion zu einem C "double".
  412. extern double cl_double_approx (const cl_F& x);
  413. // Transcendental functions
  414. // cl_pi(y) liefert die Zahl pi im selben Float-Format wie y.
  415. // > y: ein Float
  416. extern const cl_F cl_pi (const cl_F& y);
  417. // cl_pi(y) liefert die Zahl pi im Float-Format f.
  418. // > f: eine Float-Format-Spezifikation
  419. extern const cl_F cl_pi (cl_float_format_t f);
  420. // cl_pi() liefert die Zahl pi im Default-Float-Format.
  421. extern const cl_F cl_pi (void);
  422. //CL_REQUIRE(cl_F_pi_var)
  423. // sin(x) liefert den Sinus (sin x) eines Float x.
  424. extern const cl_F sin (const cl_F& x);
  425. // cos(x) liefert den Cosinus (cos x) eines Float x.
  426. extern const cl_F cos (const cl_F& x);
  427. // Return type for cl_cos_sin():
  428. struct cl_cos_sin_t {
  429. cl_R cos;
  430. cl_R sin;
  431. // Constructor:
  432. cl_cos_sin_t (const cl_R& u, const cl_R& v) : cos (u), sin (v) {}
  433. };
  434. // cl_cos_sin(x) liefert ((cos x),(sin x)), beide Werte.
  435. extern const cl_cos_sin_t cl_cos_sin (const cl_F& x);
  436. // tan(x) liefert den Tangens (tan x) eines Float x.
  437. extern const cl_F tan (const cl_F& x);
  438. // cl_exp1(y) liefert die Zahl e = exp(1) im selben Float-Format wie y.
  439. // > y: ein Float
  440. extern const cl_F cl_exp1 (const cl_F& y);
  441. // cl_exp1(y) liefert die Zahl e = exp(1) im Float-Format f.
  442. // > f: eine Float-Format-Spezifikation
  443. extern const cl_F cl_exp1 (cl_float_format_t f);
  444. // cl_exp1() liefert die Zahl e = exp(1) im Default-Float-Format.
  445. extern const cl_F cl_exp1 (void);
  446. //CL_REQUIRE(cl_F_exp1_var)
  447. // ln(x) liefert zu einem Float x>0 die Zahl ln(x).
  448. extern const cl_F ln (const cl_F& x);
  449. // Spezialfall: x Long-Float -> Ergebnis Long-Float
  450. inline const cl_LF ln (const cl_LF& x) { return The(cl_LF)(ln(The(cl_F)(x))); }
  451. // exp(x) liefert zu einem Float x die Zahl exp(x).
  452. extern const cl_F exp (const cl_F& x);
  453. // sinh(x) liefert zu einem Float x die Zahl sinh(x).
  454. extern const cl_F sinh (const cl_F& x);
  455. // cosh(x) liefert zu einem Float x die Zahl cosh(x).
  456. extern const cl_F cosh (const cl_F& x);
  457. // Return type for cl_cosh_sinh():
  458. struct cl_cosh_sinh_t {
  459. cl_R cosh;
  460. cl_R sinh;
  461. // Constructor:
  462. cl_cosh_sinh_t (const cl_R& u, const cl_R& v) : cosh (u), sinh (v) {}
  463. };
  464. // cl_cosh_sinh(x) liefert ((cosh x),(sinh x)), beide Werte.
  465. extern const cl_cosh_sinh_t cl_cosh_sinh (const cl_F& x);
  466. // tanh(x) liefert zu einem Float x die Zahl tanh(x).
  467. extern const cl_F tanh (const cl_F& x);
  468. // cl_eulerconst(y) liefert die Eulersche Konstante
  469. // im selben Float-Format wie y.
  470. // > y: ein Float
  471. extern const cl_F cl_eulerconst (const cl_F& y);
  472. // cl_eulerconst(y) liefert die Eulersche Konstante im Float-Format f.
  473. // > f: eine Float-Format-Spezifikation
  474. extern const cl_F cl_eulerconst (cl_float_format_t f);
  475. // cl_eulerconst() liefert die Eulersche Konstante im Default-Float-Format.
  476. extern const cl_F cl_eulerconst (void);
  477. //CL_REQUIRE(cl_F_eulerconst_var)
  478. // cl_catalanconst(y) liefert die Catalansche Konstante
  479. // im selben Float-Format wie y.
  480. // > y: ein Float
  481. extern const cl_F cl_catalanconst (const cl_F& y);
  482. // cl_catalanconst(y) liefert die Catalansche Konstante im Float-Format f.
  483. // > f: eine Float-Format-Spezifikation
  484. extern const cl_F cl_catalanconst (cl_float_format_t f);
  485. // cl_catalanconst() liefert die Catalansche Konstante im Default-Float-Format.
  486. extern const cl_F cl_catalanconst (void);
  487. //CL_REQUIRE(cl_F_catalanconst_var)
  488. // zeta(s) returns the Riemann zeta function at s>1.
  489. extern const cl_F cl_zeta (int s, const cl_F& y);
  490. extern const cl_F cl_zeta (int s, cl_float_format_t f);
  491. extern const cl_F cl_zeta (int s);
  492. // random_F(randomstate,n) liefert zu einem Float n>0 ein zuf�lliges
  493. // Float x mit 0 <= x < n.
  494. // > randomstate: ein Random-State, wird ver�ndert
  495. extern const cl_F random_F (cl_random_state& randomstate, const cl_F& n);
  496. inline const cl_F random_F (const cl_F& n)
  497. { return random_F(cl_default_random_state,n); }
  498. #ifdef WANT_OBFUSCATING_OPERATORS
  499. // This could be optimized to use in-place operations.
  500. inline cl_F& operator+= (cl_F& x, const cl_F& y) { return x = x + y; }
  501. inline cl_F& operator++ /* prefix */ (cl_F& x) { return x = plus1(x); }
  502. inline void operator++ /* postfix */ (cl_F& x, int dummy) { (void)dummy; x = plus1(x); }
  503. inline cl_F& operator-= (cl_F& x, const cl_F& y) { return x = x - y; }
  504. inline cl_F& operator-- /* prefix */ (cl_F& x) { return x = minus1(x); }
  505. inline void operator-- /* postfix */ (cl_F& x, int dummy) { (void)dummy; x = minus1(x); }
  506. inline cl_F& operator*= (cl_F& x, const cl_F& y) { return x = x * y; }
  507. inline cl_F& operator/= (cl_F& x, const cl_F& y) { return x = x / y; }
  508. #endif
  509. CL_REQUIRE(cl_ieee)
  510. // If this is true, floating point underflow returns zero instead of an error.
  511. extern cl_boolean cl_inhibit_floating_point_underflow;
  512. #endif /* _CL_FLOAT_H */