a68g-double.h
1 //! @file a68g-double.h
2 //! @author J. Marcel van der Veer
3
4 //! @section Copyright
5 //!
6 //! This file is part of Algol68G - an Algol 68 compiler-interpreter.
7 //! Copyright 2001-2026 J. Marcel van der Veer [algol68g@xs4all.nl].
8
9 //! @section License
10 //!
11 //! This program is free software; you can redistribute it and/or modify it
12 //! under the terms of the GNU General Public License as published by the
13 //! Free Software Foundation; either version 3 of the License, or
14 //! (at your option) any later version.
15 //!
16 //! This program is distributed in the hope that it will be useful, but
17 //! WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
18 //! or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
19 //! more details. You should have received a copy of the GNU General Public
20 //! License along with this program. If not, see [http://www.gnu.org/licenses/].
21
22 //! @section Synopsis
23 //!
24 //! LONG REAL definitions.
25
26 #if !defined (__A68G_DOUBLE_H__)
27 #define __A68G_DOUBLE_H__
28
29 #if (A68G_LEVEL >= 3)
30
31 #define MODCHK(p, m, c) (!(MODULAR_MATH (p) && (m == M_LONG_BITS)) && (c))
32
33 #if defined (HAVE_IEEE_754)
34 #define CHECK_DOUBLE_REAL(p, u) PRELUDE_ERROR (!finite_double (u), p, ERROR_INFINITE, M_LONG_REAL)
35 #define CHECK_DOUBLE_COMPLEX(p, u, v)\
36 PRELUDE_ERROR (isinf_double (u), p, ERROR_INFINITE, M_LONG_REAL);\
37 PRELUDE_ERROR (isinf_double (v), p, ERROR_INFINITE, M_LONG_REAL);
38 #else
39 #define CHECK_DOUBLE_REAL(p, u) {;}
40 #define CHECK_DOUBLE_COMPLEX(p, u, v) {;}
41 #endif
42
43 #define LONG_INT_BASE (9223372036854775808.0q)
44 #define HW(z) ((z).u[1])
45 #define LW(z) ((z).u[0])
46 #define D_NEG(d) ((HW(d) & D_SIGN) != 0)
47 #define D_LT(u, v) (HW (u) < HW (v) ? A68G_TRUE : (HW (u) == HW (v) ? LW (u) < LW (v) : A68G_FALSE))
48
49 #define RADIX (65536)
50 #define RADIX_Q (65536.0q)
51 #define CONST_2_UP_112_Q (5192296858534827628530496329220096.0q)
52
53 #define IS_ZERO(u) (HW (u) == 0 && LW (u) == 0)
54 #define IS_NEG_ZERO(u) (HW (u) == D_SIGN && LW (u) == 0)
55 #define EQ(u, v) (HW (u) == HW (v) && LW (u) == LW (v))
56 #define GT(u, v) (HW (u) != HW (v) ? HW (u) > HW (v) : LW (u) > LW (v))
57 #define GE(u, v) (HW (u) != HW (v) ? HW (u) >= HW (v) : LW (u) >= LW (v))
58
59 #define acos_double acosq
60 #define acosh_double acoshq
61 #define asin_double asinq
62 #define asinh_double asinhq
63 #define atan2_double atan2q
64 #define atan_double atanq
65 #define atanh_double atanhq
66 #define cacos_double cacosq
67 #define cacosh_double cacoshq
68 #define casin_double casinq
69 #define casinh_double casinhq
70 #define catan_double catanq
71 #define catanh_double catanhq
72 #define cbrt_double cbrtq
73 #define ccos_double ccosq
74 #define ccosh_double ccoshq
75 #define ceil_double ceilq
76 #define cexp_double cexpq
77 #define cimag_double cimagq
78 #define clog_double clogq
79 #define cos_double cosq
80 #define cosh_double coshq
81 #define creal_double crealq
82 #define csin_double csinq
83 #define csinh_double csinhq
84 #define csqrt_double csqrtq
85 #define ctan_double ctanq
86 #define ctanh_double ctanhq
87 #define erfc_double erfcq
88 #define erf_double erfq
89 #define exp_double expq
90 #define fabs_double fabsq
91 #define finite_double finiteq
92 #define floor_double floorq
93 #define fmod_double fmodq
94 #define isinf_double isinfq
95 #define lgamma_double lgammaq
96 #define log10_double log10q
97 #define log_double logq
98 #define pow_double powq
99 #define sin_double sinq
100 #define sinh_double sinhq
101 #define sqrt_double sqrtq
102 #define tan_double tanq
103 #define tanh_double tanhq
104 #define tgamma_double tgammaq
105 #define trunc_double truncq
106
107 #define ABSQ(n) ((n) >= 0.0q ? (n) : -(n))
108
109 #define POP_LONG_COMPLEX(p, re, im) {\
110 POP_OBJECT (p, im, A68G_LONG_REAL);\
111 POP_OBJECT (p, re, A68G_LONG_REAL);\
112 }
113
114 #define set_lw(z, k) {LW(z) = k; HW(z) = 0;}
115 #define set_hw(z, k) {LW(z) = 0; HW(z) = k;}
116 #define set_hwlw(z, h, l) {LW (z) = l; HW (z) = h;}
117 #define D_ZERO(z) (HW (z) == 0 && LW (z) == 0)
118
119 #define add_double(p, m, w, u, v) {\
120 DOUBLE_NUM_T _ww_;\
121 LW (_ww_) = LW (u) + LW (v);\
122 HW (_ww_) = HW (u) + HW (v);\
123 PRELUDE_ERROR (MODCHK (p, m, HW (_ww_) < HW (v)), p, ERROR_MATH, (m));\
124 if (LW (_ww_) < LW (v)) {\
125 HW (_ww_)++;\
126 PRELUDE_ERROR (MODCHK (p, m, HW (_ww_) < 1), p, ERROR_MATH, (m));\
127 }\
128 w = _ww_;\
129 }
130
131 #define sub_double(p, m, w, u, v) {\
132 DOUBLE_NUM_T _ww_;\
133 LW (_ww_) = LW (u) - LW (v);\
134 HW (_ww_) = HW (u) - HW (v);\
135 PRELUDE_ERROR (MODCHK (p, m, HW (_ww_) > HW (u)), p, ERROR_MATH, (m));\
136 if (LW (_ww_) > LW (u)) {\
137 PRELUDE_ERROR (MODCHK (p, m, HW (_ww_) == 0), p, ERROR_MATH, (m));\
138 HW (_ww_)--;\
139 }\
140 w = _ww_;\
141 }
142
143 static inline DOUBLE_NUM_T dble (DOUBLE_T x)
144 {
145 DOUBLE_NUM_T w;
146 w.f = x;
147 return w;
148 }
149
150 static inline int sign_double_int (DOUBLE_NUM_T w)
151 {
152 if (D_ZERO (w)) {
153 return 0;
154 } else if (IS_NEG_ZERO (w)) {
155 return 0;
156 } else if (D_NEG (w)) {
157 return -1;
158 } else {
159 return 1;
160 }
161 }
162
163 static inline int sign_double (DOUBLE_NUM_T w)
164 {
165 if (w.f < 0.0q) {
166 return -1;
167 } else if (w.f == 0.0q) {
168 return 0;
169 } else {
170 return 1;
171 }
172 }
173
174 static inline DOUBLE_NUM_T abs_double_int (DOUBLE_NUM_T z)
175 {
176 DOUBLE_NUM_T w;
177 LW (w) = LW (z);
178 HW (w) = HW (z) & (~D_SIGN);
179 return w;
180 }
181
182 static inline DOUBLE_NUM_T abs_double_zero (DOUBLE_NUM_T z)
183 {
184 if (IS_NEG_ZERO (z)) {
185 return abs_double_int (z);
186 } else {
187 return z;
188 }
189 }
190
191 static inline DOUBLE_NUM_T neg_double_int (DOUBLE_NUM_T z)
192 {
193 DOUBLE_NUM_T w;
194 LW (w) = LW (z);
195 if (D_NEG (z)) {
196 HW (w) = HW (z) & (~D_SIGN);
197 } else {
198 HW (w) = HW (z) | D_SIGN;
199 }
200 return w;
201 }
202
203 void m64to128 (DOUBLE_NUM_T *, UNSIGNED_T, UNSIGNED_T);
204 void m128to128 (NODE_T *, MOID_T *, DOUBLE_NUM_T *, DOUBLE_NUM_T, DOUBLE_NUM_T);
205 DOUBLE_NUM_T double_udiv (NODE_T *, MOID_T *, DOUBLE_NUM_T, DOUBLE_NUM_T, int);
206 DOUBLE_NUM_T double_uadd (NODE_T *, MOID_T *, DOUBLE_NUM_T, DOUBLE_NUM_T);
207 DOUBLE_NUM_T double_usub (NODE_T *, MOID_T *, DOUBLE_NUM_T, DOUBLE_NUM_T);
208 DOUBLE_NUM_T double_umul (NODE_T *, MOID_T *, DOUBLE_NUM_T, DOUBLE_NUM_T);
209 DOUBLE_NUM_T double_sadd (NODE_T *, DOUBLE_NUM_T, DOUBLE_NUM_T);
210 DOUBLE_NUM_T double_ssub (NODE_T *, DOUBLE_NUM_T, DOUBLE_NUM_T);
211 DOUBLE_NUM_T double_smul (NODE_T *, DOUBLE_NUM_T, DOUBLE_NUM_T);
212 DOUBLE_NUM_T double_sdiv (NODE_T *, DOUBLE_NUM_T, DOUBLE_NUM_T, int);
213
214 int sign_double_int (DOUBLE_NUM_T);
215 int sign_double (DOUBLE_NUM_T);
216 int string_to_double_int (NODE_T *, A68G_LONG_INT *, char *);
217 DOUBLE_T a68g_hypot_double (DOUBLE_T, DOUBLE_T);
218 DOUBLE_T string_to_double (char *, char **);
219 DOUBLE_T inverf_double (DOUBLE_T);
220 DOUBLE_NUM_T abs_double_int (DOUBLE_NUM_T);
221 DOUBLE_NUM_T bits_to_double_int (NODE_T *, char *);
222 DOUBLE_NUM_T dble_double (NODE_T *, REAL_T);
223 DOUBLE_NUM_T double_int_to_double (NODE_T *, DOUBLE_NUM_T);
224 DOUBLE_NUM_T double_strtou (NODE_T *, char *);
225 DOUBLE_NUM_T double_udiv (NODE_T *, MOID_T *, DOUBLE_NUM_T, DOUBLE_NUM_T, int);
226 DOUBLE_T a68g_mininf_double (void);
227 DOUBLE_T a68g_posinf_double (void);
228 void deltagammainc_double (DOUBLE_T *, DOUBLE_T *, DOUBLE_T, DOUBLE_T, DOUBLE_T, DOUBLE_T);
229
230 GPROC genie_infinity_double;
231 GPROC genie_minus_infinity_double;
232 GPROC genie_gamma_inc_g_double;
233 GPROC genie_gamma_inc_f_double;
234 GPROC genie_gamma_inc_h_double;
235 GPROC genie_gamma_inc_gf_double;
236 GPROC genie_abs_double_compl;
237 GPROC genie_abs_double_int;
238 GPROC genie_abs_double;
239 GPROC genie_acos_double_compl;
240 GPROC genie_acosdg_double;
241 GPROC genie_acosh_double_compl;
242 GPROC genie_acosh_double;
243 GPROC genie_acos_double;
244 GPROC genie_acotdg_double;
245 GPROC genie_acot_double;
246 GPROC genie_asec_double;
247 GPROC genie_asecdg_double;
248 GPROC genie_acsc_double;
249 GPROC genie_acscdg_double;
250 GPROC genie_add_double_compl;
251 GPROC genie_add_double_bits;
252 GPROC genie_add_double_int;
253 GPROC genie_add_double;
254 GPROC genie_add_double;
255 GPROC genie_and_double_bits;
256 GPROC genie_arg_double_compl;
257 GPROC genie_asin_double_compl;
258 GPROC genie_asindg_double;
259 GPROC genie_asindg_double;
260 GPROC genie_asinh_double_compl;
261 GPROC genie_asinh_double;
262 GPROC genie_asin_double;
263 GPROC genie_atan2dg_double;
264 GPROC genie_atan2_double;
265 GPROC genie_atan_double_compl;
266 GPROC genie_atandg_double;
267 GPROC genie_atanh_double_compl;
268 GPROC genie_atanh_double;
269 GPROC genie_atan_double;
270 GPROC genie_bin_double_int;
271 GPROC genie_clear_double_bits;
272 GPROC genie_conj_double_compl;
273 GPROC genie_cas_double;
274 GPROC genie_ceil_double;
275 GPROC genie_cos_double_compl;
276 GPROC genie_cosdg_double;
277 GPROC genie_cosdg_double;
278 GPROC genie_cosh_double_compl;
279 GPROC genie_cosh_double;
280 GPROC genie_cospi_double;
281 GPROC genie_cos_double;
282 GPROC genie_cotdg_double;
283 GPROC genie_cotpi_double;
284 GPROC genie_cot_double;
285 GPROC genie_sec_double;
286 GPROC genie_secdg_double;
287 GPROC genie_csc_double;
288 GPROC genie_cscdg_double;
289 GPROC genie_curt_double;
290 GPROC genie_divab_double_compl;
291 GPROC genie_divab_double;
292 GPROC genie_divab_double;
293 GPROC genie_div_double_compl;
294 GPROC genie_div_double_int;
295 GPROC genie_double_bits_pack;
296 GPROC genie_double_max_bits;
297 GPROC genie_double_max_int;
298 GPROC genie_double_max_real;
299 GPROC genie_double_min_real;
300 GPROC genie_double_small_real;
301 GPROC genie_double_zeroin;
302 GPROC genie_elem_double_bits;
303 GPROC genie_entier_double;
304 GPROC genie_eq_double_compl;
305 GPROC genie_eq_double_bits;
306 GPROC genie_eq_double_int;
307 GPROC genie_eq_double_int;
308 GPROC genie_eq_double;
309 GPROC genie_eq_double;
310 GPROC genie_eq_double;
311 GPROC genie_eq_double;
312 GPROC genie_erfc_double;
313 GPROC genie_erf_double;
314 GPROC genie_exp_double_compl;
315 GPROC genie_exp_double;
316 GPROC genie_frac_double;
317 GPROC genie_gamma_double;
318 GPROC genie_ge_double_bits;
319 GPROC genie_ge_double_int;
320 GPROC genie_ge_double_int;
321 GPROC genie_ge_double;
322 GPROC genie_ge_double;
323 GPROC genie_ge_double;
324 GPROC genie_ge_double;
325 GPROC genie_gt_double_bits;
326 GPROC genie_gt_double_int;
327 GPROC genie_gt_double_int;
328 GPROC genie_gt_double;
329 GPROC genie_gt_double;
330 GPROC genie_gt_double;
331 GPROC genie_gt_double;
332 GPROC genie_i_double_compl;
333 GPROC genie_i_int_double_compl;
334 GPROC genie_im_double_compl;
335 GPROC genie_inverfc_double;
336 GPROC genie_inverf_double;
337 GPROC genie_le_double_bits;
338 GPROC genie_le_double_int;
339 GPROC genie_le_double_int;
340 GPROC genie_lengthen_bits_to_double_bits;
341 GPROC genie_lengthen_double_compl_to_long_mp_complex;
342 GPROC genie_lengthen_complex_to_double_compl;
343 GPROC genie_lengthen_double_int_to_mp;
344 GPROC genie_lengthen_int_to_double_int;
345 GPROC genie_lengthen_double_to_mp;
346 GPROC genie_lengthen_real_to_double;
347 GPROC genie_le_double;
348 GPROC genie_le_double;
349 GPROC genie_le_double;
350 GPROC genie_le_double;
351 GPROC genie_ln_double_compl;
352 GPROC genie_lngamma_double;
353 GPROC genie_ln_double;
354 GPROC genie_log_double;
355 GPROC genie_lt_double_bits;
356 GPROC genie_lt_double_int;
357 GPROC genie_lt_double_int;
358 GPROC genie_lt_double;
359 GPROC genie_lt_double;
360 GPROC genie_lt_double;
361 GPROC genie_lt_double;
362 GPROC genie_minusab_double_compl;
363 GPROC genie_minusab_double_int;
364 GPROC genie_minusab_double_int;
365 GPROC genie_minusab_double;
366 GPROC genie_minusab_double;
367 GPROC genie_minus_double_compl;
368 GPROC genie_minus_double_int;
369 GPROC genie_minus_double;
370 GPROC genie_modab_double_int;
371 GPROC genie_modab_double_int;
372 GPROC genie_mod_double_bits;
373 GPROC genie_mod_double_int;
374 GPROC genie_mul_double_compl;
375 GPROC genie_mul_double_int;
376 GPROC genie_mul_double;
377 GPROC genie_mul_double;
378 GPROC genie_ne_double_compl;
379 GPROC genie_ne_double_bits;
380 GPROC genie_ne_double_int;
381 GPROC genie_ne_double_int;
382 GPROC genie_ne_double_int;
383 GPROC genie_ne_double_int;
384 GPROC genie_ne_double;
385 GPROC genie_ne_double;
386 GPROC genie_ne_double;
387 GPROC genie_ne_double;
388 GPROC genie_ne_double;
389 GPROC genie_ne_double;
390 GPROC genie_ne_double;
391 GPROC genie_ne_double;
392 GPROC genie_next_random_double;
393 GPROC genie_not_double_bits;
394 GPROC genie_odd_double_int;
395 GPROC genie_or_double_bits;
396 GPROC genie_overab_double_int;
397 GPROC genie_overab_double_int;
398 GPROC genie_over_double_bits;
399 GPROC genie_over_double_int;
400 GPROC genie_over_double;
401 GPROC genie_over_double;
402 GPROC genie_pi_double;
403 GPROC genie_plusab_double_compl;
404 GPROC genie_plusab_double_int;
405 GPROC genie_plusab_double_int;
406 GPROC genie_plusab_double;
407 GPROC genie_pow_double_compl_int;
408 GPROC genie_pow_double_int_int;
409 GPROC genie_pow_double;
410 GPROC genie_pow_double_int;
411 GPROC genie_re_double_compl;
412 GPROC genie_rol_double_bits;
413 GPROC genie_ror_double_bits;
414 GPROC genie_round_double;
415 GPROC genie_set_double_bits;
416 GPROC genie_shl_double_bits;
417 GPROC genie_shorten_double_compl_to_complex;
418 GPROC genie_shorten_double_bits_to_bits;
419 GPROC genie_shorten_long_int_to_int;
420 GPROC genie_shorten_long_mp_complex_to_double_compl;
421 GPROC genie_shorten_mp_to_double_int;
422 GPROC genie_shorten_mp_to_double;
423 GPROC genie_shorten_double_to_real;
424 GPROC genie_shr_double_bits;
425 GPROC genie_sign_double_int;
426 GPROC genie_sign_double;
427 GPROC genie_sin_double_compl;
428 GPROC genie_sindg_double;
429 GPROC genie_sinh_double_compl;
430 GPROC genie_sinh_double;
431 GPROC genie_sinpi_double;
432 GPROC genie_sin_double;
433 GPROC genie_sqrt_double_compl;
434 GPROC genie_sqrt_double;
435 GPROC genie_sqrt_double;
436 GPROC genie_sqrt_double;
437 GPROC genie_sub_double_compl;
438 GPROC genie_sub_double_bits;
439 GPROC genie_sub_double_int;
440 GPROC genie_sub_double;
441 GPROC genie_sub_double;
442 GPROC genie_tan_double_compl;
443 GPROC genie_tandg_double;
444 GPROC genie_tanh_double_compl;
445 GPROC genie_tanh_double;
446 GPROC genie_tanpi_double;
447 GPROC genie_tan_double;
448 GPROC genie_timesab_double_compl;
449 GPROC genie_timesab_double_int;
450 GPROC genie_timesab_double_int;
451 GPROC genie_timesab_double;
452 GPROC genie_timesab_double;
453 GPROC genie_times_double_bits;
454 GPROC genie_trunc_double;
455 GPROC genie_widen_double_int_to_double;
456 GPROC genie_xor_double_bits;
457 GPROC genie_beta_inc_cf_double;
458 GPROC genie_beta_double;
459 GPROC genie_ln_beta_double;
460 GPROC genie_gamma_inc_double;
461 GPROC genie_zero_double_int;
462
463 #endif
464
465 #endif
|
© 2002-2026 J.M. van der Veer (jmvdveer@xs4all.nl)
|