Merge commit 'ca5e0414e96886177d883a249edd957d2331db65'
[bpt/guile.git] / libguile / numbers.h
CommitLineData
0f2d19dd
JB
1/* classes: h_files */
2
3c9a524f
DH
3#ifndef SCM_NUMBERS_H
4#define SCM_NUMBERS_H
dee01b01 5
7facc08a
MW
6/* Copyright (C) 1995,1996,1998,2000,2001,2002,2003,2004,2005, 2006,
7 * 2008, 2009, 2010, 2011, 2013 Free Software Foundation, Inc.
dee01b01 8 *
73be1d9e 9 * This library is free software; you can redistribute it and/or
53befeb7
NJ
10 * modify it under the terms of the GNU Lesser General Public License
11 * as published by the Free Software Foundation; either version 3 of
12 * the License, or (at your option) any later version.
dee01b01 13 *
53befeb7
NJ
14 * This library is distributed in the hope that it will be useful, but
15 * WITHOUT ANY WARRANTY; without even the implied warranty of
73be1d9e
MV
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 * Lesser General Public License for more details.
dee01b01 18 *
73be1d9e
MV
19 * You should have received a copy of the GNU Lesser General Public
20 * License along with this library; if not, write to the Free Software
53befeb7
NJ
21 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
22 * 02110-1301 USA
73be1d9e 23 */
d3a6bc94 24
0f2d19dd
JB
25\f
26
cd036260
MV
27#include <gmp.h>
28
b4309c3c 29#include "libguile/__scm.h"
34f74fe1
MD
30#include "libguile/print.h"
31
889975e5
MG
32#ifndef SCM_T_WCHAR_DEFINED
33typedef scm_t_int32 scm_t_wchar;
34#define SCM_T_WCHAR_DEFINED
35#endif /* SCM_T_WCHAR_DEFINED */
36
0f2d19dd
JB
37\f
38
14282d0f 39/* Immediate Numbers, also known as fixnums
0f2d19dd 40 *
14282d0f 41 * Inums are exact integer data that fits within an SCM word. */
0f2d19dd 42
c0060c95
MV
43/* SCM_T_SIGNED_MAX is (- (expt 2 n) 1),
44 * SCM_MOST_POSITIVE_FIXNUM should be (- (expt 2 (- n 2)) 1)
45 * which is the same as (/ (- (expt 2 n) 4) 4)
46 */
47
004c0902 48#define SCM_I_FIXNUM_BIT (SCM_LONG_BIT - 2)
c0060c95 49#define SCM_MOST_POSITIVE_FIXNUM ((SCM_T_SIGNED_BITS_MAX-3)/4)
004c0902 50#define SCM_MOST_NEGATIVE_FIXNUM (-SCM_MOST_POSITIVE_FIXNUM-1)
5c75b29f 51
56100716
DH
52/* SCM_SRS is signed right shift */
53#if (-1 == (((-1) << 2) + 2) >> 2)
14282d0f 54# define SCM_SRS(x, y) ((x) >> (y))
0f2d19dd 55#else
14282d0f 56# define SCM_SRS(x, y) ((x) < 0 ? ~((~(x)) >> (y)) : ((x) >> (y)))
56100716 57#endif /* (-1 == (((-1) << 2) + 2) >> 2) */
0f2d19dd
JB
58
59
3aa13a05
MV
60#define SCM_I_INUMP(x) (2 & SCM_UNPACK (x))
61#define SCM_I_NINUMP(x) (!SCM_I_INUMP (x))
5a572ca1 62#define SCM_I_MAKINUM(x) \
5d7d39ff 63 (SCM_PACK ((((scm_t_signed_bits) (x)) << 2) + scm_tc2_int))
3aa13a05 64#define SCM_I_INUM(x) (SCM_SRS ((scm_t_signed_bits) SCM_UNPACK (x), 2))
0f2d19dd 65
894a712b
DH
66/* SCM_FIXABLE is true if its long argument can be encoded in an SCM_INUM. */
67#define SCM_POSFIXABLE(n) ((n) <= SCM_MOST_POSITIVE_FIXNUM)
68#define SCM_NEGFIXABLE(n) ((n) >= SCM_MOST_NEGATIVE_FIXNUM)
14282d0f 69#define SCM_FIXABLE(n) (SCM_POSFIXABLE (n) && SCM_NEGFIXABLE (n))
894a712b
DH
70
71
cff5fa33
MW
72#define SCM_INUM0 (SCM_I_MAKINUM (0)) /* A name for 0 */
73#define SCM_INUM1 (SCM_I_MAKINUM (1)) /* A name for 1 */
74
0f2d19dd 75
c0060c95 76/* SCM_MAXEXP is the maximum double precision exponent
88eb6852
MD
77 * SCM_FLTMAX is less than or scm_equal the largest single precision float
78 */
79
f0ad7455
RB
80#if SCM_HAVE_STDC_HEADERS
81# ifndef GO32
1e498fbd
SJ
82# include <float.h>
83# ifdef __MINGW32__
84# define copysign _copysign
1e498fbd
SJ
85# define finite _finite
86# endif /* __MINGW32__ */
f0ad7455 87# endif /* ndef GO32 */
88eb6852 88#endif /* def STDC_HEADERS */
f0ad7455 89
88eb6852 90#ifdef DBL_MAX_10_EXP
f0ad7455 91# define SCM_MAXEXP DBL_MAX_10_EXP
88eb6852 92#else
f0ad7455 93# define SCM_MAXEXP 308 /* IEEE doubles */
88eb6852 94#endif /* def DBL_MAX_10_EXP */
f0ad7455 95
88eb6852 96#ifdef FLT_MAX
f0ad7455 97# define SCM_FLTMAX FLT_MAX
88eb6852 98#else
f0ad7455 99# define SCM_FLTMAX 1e+23
88eb6852
MD
100#endif /* def FLT_MAX */
101
0f2d19dd 102
2881e77b
MV
103/* SCM_INTBUFLEN is the maximum number of characters neccessary for
104 * the printed or scm_string representation of an scm_t_intmax in
105 * radix 2. The buffer passed to scm_iint2str and scm_iuint2str must
106 * be of this size, for example.
0f2d19dd 107 */
2881e77b 108#define SCM_INTBUFLEN (5 + SCM_CHAR_BIT*sizeof(scm_t_intmax))
0f2d19dd
JB
109
110\f
111
112/* Numbers
113 */
114
534c55a9
DH
115
116/* Note that scm_tc16_real and scm_tc16_complex are given tc16-codes that only
117 * differ in one bit: This way, checking if an object is an inexact number can
118 * be done quickly (using the TYP16S macro). */
119
f03314f9
DH
120/* Number subtype 1 to 3 (note the dependency on the predicates SCM_INEXACTP
121 * and SCM_NUMP) */
534c55a9
DH
122#define scm_tc16_big (scm_tc7_number + 1 * 256L)
123#define scm_tc16_real (scm_tc7_number + 2 * 256L)
124#define scm_tc16_complex (scm_tc7_number + 3 * 256L)
f92e85f7 125#define scm_tc16_fraction (scm_tc7_number + 4 * 256L)
534c55a9 126
f03314f9
DH
127#define SCM_INEXACTP(x) \
128 (!SCM_IMP (x) && (0xfeff & SCM_CELL_TYPE (x)) == scm_tc16_real)
dc7da0be
AW
129#define SCM_REALP(x) (SCM_HAS_TYP16 (x, scm_tc16_real))
130#define SCM_COMPLEXP(x) (SCM_HAS_TYP16 (x, scm_tc16_complex))
88eb6852 131
0aed71aa
AW
132#define SCM_REAL_VALUE(x) (((scm_t_double *) SCM2PTR (x))->real)
133#define SCM_COMPLEX_REAL(x) (((scm_t_complex *) SCM2PTR (x))->real)
134#define SCM_COMPLEX_IMAG(x) (((scm_t_complex *) SCM2PTR (x))->imag)
0f2d19dd 135
d3e7e88d 136/* Each bignum is just an mpz_t stored in a double cell starting at word 1. */
fba8fdc0 137#define SCM_I_BIG_MPZ(x) (*((mpz_t *) (SCM_CELL_OBJECT_LOC((x),1))))
dc7da0be 138#define SCM_BIGP(x) (SCM_HAS_TYP16 (x, scm_tc16_big))
0f2d19dd 139
3aa13a05 140#define SCM_NUMBERP(x) (SCM_I_INUMP(x) || SCM_NUMP(x))
dc7da0be 141#define SCM_NUMP(x) (SCM_HAS_TYP7 (x, scm_tc7_number))
f92e85f7 142
dc7da0be 143#define SCM_FRACTIONP(x) (SCM_HAS_TYP16 (x, scm_tc16_fraction))
651f07f8
DH
144#define SCM_FRACTION_NUMERATOR(x) (SCM_CELL_OBJECT_1 (x))
145#define SCM_FRACTION_DENOMINATOR(x) (SCM_CELL_OBJECT_2 (x))
88eb6852 146
0f2d19dd
JB
147\f
148
92c2555f 149typedef struct scm_t_double
0f2d19dd
JB
150{
151 SCM type;
88eb6852
MD
152 SCM pad;
153 double real;
92c2555f 154} scm_t_double;
0f2d19dd 155
92c2555f 156typedef struct scm_t_complex
0f2d19dd 157{
03604fcf
LC
158 SCM type;
159 SCM pad;
88eb6852
MD
160 double real;
161 double imag;
92c2555f 162} scm_t_complex;
0f2d19dd 163
904a78f1 164
0f2d19dd 165\f
0f2d19dd 166
33b001fd 167SCM_API SCM scm_exact_p (SCM x);
022dda69 168SCM_API int scm_is_exact (SCM x);
33b001fd
MV
169SCM_API SCM scm_odd_p (SCM n);
170SCM_API SCM scm_even_p (SCM n);
2519490c
MW
171SCM_API SCM scm_finite_p (SCM x);
172SCM_API SCM scm_inf_p (SCM x);
173SCM_API SCM scm_nan_p (SCM x);
232898d9
MV
174SCM_API SCM scm_inf (void);
175SCM_API SCM scm_nan (void);
33b001fd
MV
176SCM_API SCM scm_abs (SCM x);
177SCM_API SCM scm_quotient (SCM x, SCM y);
178SCM_API SCM scm_remainder (SCM x, SCM y);
179SCM_API SCM scm_modulo (SCM x, SCM y);
5fbf680b 180SCM_API void scm_euclidean_divide (SCM x, SCM y, SCM *q, SCM *r);
ff62c168
MW
181SCM_API SCM scm_euclidean_quotient (SCM x, SCM y);
182SCM_API SCM scm_euclidean_remainder (SCM x, SCM y);
8f9da340
MW
183SCM_API void scm_floor_divide (SCM x, SCM y, SCM *q, SCM *r);
184SCM_API SCM scm_floor_quotient (SCM x, SCM y);
185SCM_API SCM scm_floor_remainder (SCM x, SCM y);
186SCM_API void scm_ceiling_divide (SCM x, SCM y, SCM *q, SCM *r);
187SCM_API SCM scm_ceiling_quotient (SCM x, SCM y);
188SCM_API SCM scm_ceiling_remainder (SCM x, SCM y);
189SCM_API void scm_truncate_divide (SCM x, SCM y, SCM *q, SCM *r);
190SCM_API SCM scm_truncate_quotient (SCM x, SCM y);
191SCM_API SCM scm_truncate_remainder (SCM x, SCM y);
5fbf680b 192SCM_API void scm_centered_divide (SCM x, SCM y, SCM *q, SCM *r);
ff62c168
MW
193SCM_API SCM scm_centered_quotient (SCM x, SCM y);
194SCM_API SCM scm_centered_remainder (SCM x, SCM y);
8f9da340
MW
195SCM_API void scm_round_divide (SCM x, SCM y, SCM *q, SCM *r);
196SCM_API SCM scm_round_quotient (SCM x, SCM y);
197SCM_API SCM scm_round_remainder (SCM x, SCM y);
33b001fd
MV
198SCM_API SCM scm_gcd (SCM x, SCM y);
199SCM_API SCM scm_lcm (SCM n1, SCM n2);
200SCM_API SCM scm_logand (SCM n1, SCM n2);
201SCM_API SCM scm_logior (SCM n1, SCM n2);
202SCM_API SCM scm_logxor (SCM n1, SCM n2);
203SCM_API SCM scm_logtest (SCM n1, SCM n2);
204SCM_API SCM scm_logbit_p (SCM n1, SCM n2);
205SCM_API SCM scm_lognot (SCM n);
d885e204 206SCM_API SCM scm_modulo_expt (SCM n, SCM k, SCM m);
33b001fd 207SCM_API SCM scm_integer_expt (SCM z1, SCM z2);
e08a12b5
MW
208SCM_API SCM scm_ash (SCM n, SCM count);
209SCM_API SCM scm_round_ash (SCM n, SCM count);
33b001fd
MV
210SCM_API SCM scm_bit_extract (SCM n, SCM start, SCM end);
211SCM_API SCM scm_logcount (SCM n);
212SCM_API SCM scm_integer_length (SCM n);
1be6b49c 213
5fbf680b 214SCM_INTERNAL SCM scm_i_euclidean_divide (SCM x, SCM y);
8f9da340
MW
215SCM_INTERNAL SCM scm_i_floor_divide (SCM x, SCM y);
216SCM_INTERNAL SCM scm_i_ceiling_divide (SCM x, SCM y);
217SCM_INTERNAL SCM scm_i_truncate_divide (SCM x, SCM y);
5fbf680b 218SCM_INTERNAL SCM scm_i_centered_divide (SCM x, SCM y);
8f9da340 219SCM_INTERNAL SCM scm_i_round_divide (SCM x, SCM y);
5fbf680b 220
78d3deb1
AW
221SCM_INTERNAL SCM scm_i_gcd (SCM x, SCM y, SCM rest);
222SCM_INTERNAL SCM scm_i_lcm (SCM x, SCM y, SCM rest);
223SCM_INTERNAL SCM scm_i_logand (SCM x, SCM y, SCM rest);
224SCM_INTERNAL SCM scm_i_logior (SCM x, SCM y, SCM rest);
225SCM_INTERNAL SCM scm_i_logxor (SCM x, SCM y, SCM rest);
226
2881e77b
MV
227SCM_API size_t scm_iint2str (scm_t_intmax num, int rad, char *p);
228SCM_API size_t scm_iuint2str (scm_t_uintmax num, int rad, char *p);
33b001fd
MV
229SCM_API SCM scm_number_to_string (SCM x, SCM radix);
230SCM_API int scm_print_real (SCM sexp, SCM port, scm_print_state *pstate);
231SCM_API int scm_print_complex (SCM sexp, SCM port, scm_print_state *pstate);
232SCM_API int scm_bigprint (SCM exp, SCM port, scm_print_state *pstate);
2b829bbb
KR
233SCM_API SCM scm_c_locale_stringn_to_number (const char *mem, size_t len,
234 unsigned int radix);
3f47e526 235SCM_INTERNAL SCM scm_i_string_to_number (SCM str, unsigned int radix);
33b001fd 236SCM_API SCM scm_string_to_number (SCM str, SCM radix);
33b001fd
MV
237SCM_API SCM scm_bigequal (SCM x, SCM y);
238SCM_API SCM scm_real_equalp (SCM x, SCM y);
239SCM_API SCM scm_complex_equalp (SCM x, SCM y);
240SCM_API SCM scm_number_p (SCM x);
8507ec80 241SCM_API SCM scm_complex_p (SCM x);
33b001fd 242SCM_API SCM scm_real_p (SCM x);
8507ec80 243SCM_API SCM scm_rational_p (SCM z);
33b001fd 244SCM_API SCM scm_integer_p (SCM x);
900a897c 245SCM_API SCM scm_exact_integer_p (SCM x);
33b001fd 246SCM_API SCM scm_inexact_p (SCM x);
022dda69 247SCM_API int scm_is_inexact (SCM x);
33b001fd
MV
248SCM_API SCM scm_num_eq_p (SCM x, SCM y);
249SCM_API SCM scm_less_p (SCM x, SCM y);
250SCM_API SCM scm_gr_p (SCM x, SCM y);
251SCM_API SCM scm_leq_p (SCM x, SCM y);
252SCM_API SCM scm_geq_p (SCM x, SCM y);
253SCM_API SCM scm_zero_p (SCM z);
254SCM_API SCM scm_positive_p (SCM x);
255SCM_API SCM scm_negative_p (SCM x);
256SCM_API SCM scm_max (SCM x, SCM y);
257SCM_API SCM scm_min (SCM x, SCM y);
258SCM_API SCM scm_sum (SCM x, SCM y);
40882e3d 259SCM_API SCM scm_oneplus (SCM x);
33b001fd 260SCM_API SCM scm_difference (SCM x, SCM y);
40882e3d 261SCM_API SCM scm_oneminus (SCM x);
33b001fd 262SCM_API SCM scm_product (SCM x, SCM y);
33b001fd 263SCM_API SCM scm_divide (SCM x, SCM y);
f92e85f7
MV
264SCM_API SCM scm_floor (SCM x);
265SCM_API SCM scm_ceiling (SCM x);
3101f40f
MV
266SCM_API double scm_c_truncate (double x);
267SCM_API double scm_c_round (double x);
f92e85f7
MV
268SCM_API SCM scm_truncate_number (SCM x);
269SCM_API SCM scm_round_number (SCM x);
6fc4d012 270SCM_API SCM scm_expt (SCM z1, SCM z2);
ad79736c
AW
271SCM_API SCM scm_sin (SCM z);
272SCM_API SCM scm_cos (SCM z);
273SCM_API SCM scm_tan (SCM z);
274SCM_API SCM scm_sinh (SCM z);
275SCM_API SCM scm_cosh (SCM z);
276SCM_API SCM scm_tanh (SCM z);
277SCM_API SCM scm_asin (SCM z);
278SCM_API SCM scm_acos (SCM z);
279SCM_API SCM scm_atan (SCM x, SCM y);
280SCM_API SCM scm_sys_asinh (SCM z);
281SCM_API SCM scm_sys_acosh (SCM z);
282SCM_API SCM scm_sys_atanh (SCM z);
33b001fd
MV
283SCM_API SCM scm_make_rectangular (SCM z1, SCM z2);
284SCM_API SCM scm_make_polar (SCM z1, SCM z2);
285SCM_API SCM scm_real_part (SCM z);
286SCM_API SCM scm_imag_part (SCM z);
287SCM_API SCM scm_magnitude (SCM z);
288SCM_API SCM scm_angle (SCM z);
289SCM_API SCM scm_exact_to_inexact (SCM z);
290SCM_API SCM scm_inexact_to_exact (SCM z);
291SCM_API SCM scm_trunc (SCM x);
8ab3d8a0
KR
292SCM_API SCM scm_log (SCM z);
293SCM_API SCM scm_log10 (SCM z);
294SCM_API SCM scm_exp (SCM z);
295SCM_API SCM scm_sqrt (SCM z);
882c8963 296SCM_API void scm_exact_integer_sqrt (SCM k, SCM *s, SCM *r);
33b001fd 297
78d3deb1
AW
298SCM_INTERNAL SCM scm_i_min (SCM x, SCM y, SCM rest);
299SCM_INTERNAL SCM scm_i_max (SCM x, SCM y, SCM rest);
300SCM_INTERNAL SCM scm_i_sum (SCM x, SCM y, SCM rest);
301SCM_INTERNAL SCM scm_i_difference (SCM x, SCM y, SCM rest);
302SCM_INTERNAL SCM scm_i_product (SCM x, SCM y, SCM rest);
303SCM_INTERNAL SCM scm_i_divide (SCM x, SCM y, SCM rest);
882c8963 304SCM_INTERNAL SCM scm_i_exact_integer_sqrt (SCM k);
78d3deb1 305
d3e7e88d 306/* bignum internal functions */
102dbb6f
LC
307SCM_INTERNAL SCM scm_i_mkbig (void);
308SCM_API /* FIXME: not internal */ SCM scm_i_normbig (SCM x);
309SCM_INTERNAL int scm_i_bigcmp (SCM a, SCM b);
310SCM_INTERNAL SCM scm_i_dbl2big (double d);
311SCM_INTERNAL SCM scm_i_dbl2num (double d);
312SCM_API /* FIXME: not internal */ double scm_i_big2dbl (SCM b);
313SCM_API /* FIXME: not internal */ SCM scm_i_long2big (long n);
314SCM_API /* FIXME: not internal */ SCM scm_i_ulong2big (unsigned long n);
315SCM_API /* FIXME: not internal */ SCM scm_i_clonebig (SCM src_big, int same_sign_p);
d3e7e88d 316
f92e85f7 317/* ratio functions */
f92e85f7
MV
318SCM_API SCM scm_rationalize (SCM x, SCM err);
319SCM_API SCM scm_numerator (SCM z);
320SCM_API SCM scm_denominator (SCM z);
f92e85f7
MV
321
322/* fraction internal functions */
102dbb6f
LC
323SCM_INTERNAL double scm_i_fraction2double (SCM z);
324SCM_INTERNAL SCM scm_i_fraction_equalp (SCM x, SCM y);
325SCM_INTERNAL int scm_i_print_fraction (SCM sexp, SCM port, scm_print_state *pstate);
f92e85f7 326
b479fe9a 327/* general internal functions */
102dbb6f
LC
328SCM_INTERNAL void scm_i_print_double (double val, SCM port);
329SCM_INTERNAL void scm_i_print_complex (double real, double imag, SCM port);
b479fe9a 330
d1b5b400 331/* conversion functions for integers */
73e4de09
MV
332
333SCM_API int scm_is_integer (SCM val);
900a897c 334SCM_API int scm_is_exact_integer (SCM val);
73e4de09
MV
335SCM_API int scm_is_signed_integer (SCM val,
336 scm_t_intmax min, scm_t_intmax max);
337SCM_API int scm_is_unsigned_integer (SCM val,
338 scm_t_uintmax min, scm_t_uintmax max);
339
340SCM_API SCM scm_from_signed_integer (scm_t_intmax val);
341SCM_API SCM scm_from_unsigned_integer (scm_t_uintmax val);
342
343SCM_API scm_t_intmax scm_to_signed_integer (SCM val,
344 scm_t_intmax min,
345 scm_t_intmax max);
346SCM_API scm_t_uintmax scm_to_unsigned_integer (SCM val,
347 scm_t_uintmax min,
348 scm_t_uintmax max);
349
bfd7932e
MV
350SCM_API scm_t_int8 scm_to_int8 (SCM x);
351SCM_API SCM scm_from_int8 (scm_t_int8 x);
352
353SCM_API scm_t_uint8 scm_to_uint8 (SCM x);
354SCM_API SCM scm_from_uint8 (scm_t_uint8 x);
355
356SCM_API scm_t_int16 scm_to_int16 (SCM x);
357SCM_API SCM scm_from_int16 (scm_t_int16 x);
358
359SCM_API scm_t_uint16 scm_to_uint16 (SCM x);
360SCM_API SCM scm_from_uint16 (scm_t_uint16 x);
361
362SCM_API scm_t_int32 scm_to_int32 (SCM x);
363SCM_API SCM scm_from_int32 (scm_t_int32 x);
364
365SCM_API scm_t_uint32 scm_to_uint32 (SCM x);
366SCM_API SCM scm_from_uint32 (scm_t_uint32 x);
367
904a78f1
MG
368SCM_API scm_t_wchar scm_to_wchar (SCM x);
369SCM_API SCM scm_from_wchar (scm_t_wchar x);
370
bfd7932e
MV
371SCM_API scm_t_int64 scm_to_int64 (SCM x);
372SCM_API SCM scm_from_int64 (scm_t_int64 x);
373
374SCM_API scm_t_uint64 scm_to_uint64 (SCM x);
375SCM_API SCM scm_from_uint64 (scm_t_uint64 x);
376
cd036260
MV
377SCM_API void scm_to_mpz (SCM x, mpz_t rop);
378SCM_API SCM scm_from_mpz (mpz_t rop);
379
380
d1b5b400
MV
381/* The conversion functions for other types are aliased to the
382 appropriate ones from above. We pick the right one based on the
383 size of the type.
384
385 Not each and every possibility is covered by the code below, and
386 while it is trivial to complete the tests, it might be better to
387 just test for the 'sane' possibilities. When one of the tests
388 below fails, chances are good that some silent assumption somewhere
389 else will also fail.
390*/
391
392#if SCM_SIZEOF_CHAR == 1
393#define scm_to_schar scm_to_int8
394#define scm_from_schar scm_from_int8
395#define scm_to_uchar scm_to_uint8
396#define scm_from_uchar scm_from_uint8
73e4de09 397#if CHAR_MIN == 0
d1b5b400
MV
398#define scm_to_char scm_to_uint8
399#define scm_from_char scm_from_uint8
73e4de09 400#else
d1b5b400
MV
401#define scm_to_char scm_to_int8
402#define scm_from_char scm_from_int8
73e4de09 403#endif
d1b5b400
MV
404#else
405#error sizeof(char) is not 1.
22008a78
MV
406#endif
407
d1b5b400
MV
408#if SCM_SIZEOF_SHORT == 1
409#define scm_to_short scm_to_int8
410#define scm_from_short scm_from_int8
411#define scm_to_ushort scm_to_uint8
412#define scm_from_ushort scm_from_uint8
413#else
414#if SCM_SIZEOF_SHORT == 2
415#define scm_to_short scm_to_int16
416#define scm_from_short scm_from_int16
417#define scm_to_ushort scm_to_uint16
418#define scm_from_ushort scm_from_uint16
419#else
420#if SCM_SIZEOF_SHORT == 4
421#define scm_to_short scm_to_int32
422#define scm_from_short scm_from_int32
423#define scm_to_ushort scm_to_uint32
424#define scm_from_ushort scm_from_uint32
73e4de09 425#else
d1b5b400
MV
426#error sizeof(short) is not 1, 2, or 4.
427#endif
428#endif
73e4de09
MV
429#endif
430
d1b5b400
MV
431#if SCM_SIZEOF_INT == 4
432#define scm_to_int scm_to_int32
433#define scm_from_int scm_from_int32
434#define scm_to_uint scm_to_uint32
435#define scm_from_uint scm_from_uint32
436#else
437#if SCM_SIZEOF_INT == 8
438#define scm_to_int scm_to_int64
439#define scm_from_int scm_from_int64
440#define scm_to_uint scm_to_uint64
441#define scm_from_uint scm_from_uint64
442#else
443#error sizeof(int) is not 4 or 8.
444#endif
445#endif
73e4de09 446
d1b5b400
MV
447#if SCM_SIZEOF_LONG == 4
448#define scm_to_long scm_to_int32
449#define scm_from_long scm_from_int32
450#define scm_to_ulong scm_to_uint32
451#define scm_from_ulong scm_from_uint32
452#else
453#if SCM_SIZEOF_LONG == 8
454#define scm_to_long scm_to_int64
455#define scm_from_long scm_from_int64
456#define scm_to_ulong scm_to_uint64
457#define scm_from_ulong scm_from_uint64
458#else
459#error sizeof(long) is not 4 or 8.
460#endif
461#endif
73e4de09 462
d1b5b400
MV
463#if SCM_SIZEOF_INTMAX == 4
464#define scm_to_intmax scm_to_int32
465#define scm_from_intmax scm_from_int32
466#define scm_to_uintmax scm_to_uint32
467#define scm_from_uintmax scm_from_uint32
468#else
469#if SCM_SIZEOF_INTMAX == 8
470#define scm_to_intmax scm_to_int64
471#define scm_from_intmax scm_from_int64
472#define scm_to_uintmax scm_to_uint64
473#define scm_from_uintmax scm_from_uint64
474#else
55f26379 475#error sizeof(scm_t_intmax) is not 4 or 8.
d1b5b400
MV
476#endif
477#endif
73e4de09 478
d1b5b400
MV
479#if SCM_SIZEOF_LONG_LONG == 0
480#else
481#if SCM_SIZEOF_LONG_LONG == 8
482#define scm_to_long_long scm_to_int64
483#define scm_from_long_long scm_from_int64
484#define scm_to_ulong_long scm_to_uint64
485#define scm_from_ulong_long scm_from_uint64
486#else
487#error sizeof(long long) is not 8.
488#endif
489#endif
73e4de09 490
d1b5b400
MV
491#if SCM_SIZEOF_SIZE_T == 4
492#define scm_to_ssize_t scm_to_int32
493#define scm_from_ssize_t scm_from_int32
494#define scm_to_size_t scm_to_uint32
495#define scm_from_size_t scm_from_uint32
496#else
497#if SCM_SIZEOF_SIZE_T == 8
498#define scm_to_ssize_t scm_to_int64
499#define scm_from_ssize_t scm_from_int64
500#define scm_to_size_t scm_to_uint64
501#define scm_from_size_t scm_from_uint64
502#else
503#error sizeof(size_t) is not 4 or 8.
504#endif
22008a78
MV
505#endif
506
7facc08a
MW
507#if SCM_SIZEOF_SCM_T_PTRDIFF == 4
508#define scm_to_ptrdiff_t scm_to_int32
509#define scm_from_ptrdiff_t scm_from_int32
510#else
511#if SCM_SIZEOF_SCM_T_PTRDIFF == 8
512#define scm_to_ptrdiff_t scm_to_int64
513#define scm_from_ptrdiff_t scm_from_int64
514#else
515#error sizeof(scm_t_ptrdiff) is not 4 or 8.
516#endif
517#endif
518
0b3b7369
AW
519#if SCM_SIZEOF_INTPTR_T == 0
520/* No intptr_t; use size_t functions. */
521#define scm_to_intptr_t scm_to_ssize_t
522#define scm_from_intptr_t scm_from_ssize_t
523#elif SCM_SIZEOF_INTPTR_T == 4
524#define scm_to_intptr_t scm_to_int32
525#define scm_from_intptr_t scm_from_int32
526#elif SCM_SIZEOF_INTPTR_T == 8
527#define scm_to_intptr_t scm_to_int64
528#define scm_from_intptr_t scm_from_int64
529#else
530#error sizeof(intptr_t) is not 4 or 8.
531#endif
532
533#if SCM_SIZEOF_UINTPTR_T == 0
534/* No uintptr_t; use size_t functions. */
535#define scm_to_uintptr_t scm_to_size_t
536#define scm_from_uintptr_t scm_from_size_t
537#elif SCM_SIZEOF_UINTPTR_T == 4
538#define scm_to_uintptr_t scm_to_uint32
539#define scm_from_uintptr_t scm_from_uint32
540#elif SCM_SIZEOF_UINTPTR_T == 8
541#define scm_to_uintptr_t scm_to_uint64
542#define scm_from_uintptr_t scm_from_uint64
543#else
544#error sizeof(uintptr_t) is not 4 or 8.
545#endif
546
8507ec80 547/* conversion functions for double */
22008a78 548
73e4de09 549SCM_API int scm_is_real (SCM val);
55f26379 550SCM_API int scm_is_rational (SCM val);
73e4de09
MV
551SCM_API double scm_to_double (SCM val);
552SCM_API SCM scm_from_double (double val);
553
8507ec80
MV
554/* conversion functions for complex */
555
556SCM_API int scm_is_complex (SCM val);
557SCM_API SCM scm_c_make_rectangular (double re, double im);
558SCM_API SCM scm_c_make_polar (double mag, double ang);
559SCM_API double scm_c_real_part (SCM z);
560SCM_API double scm_c_imag_part (SCM z);
561SCM_API double scm_c_magnitude (SCM z);
562SCM_API double scm_c_angle (SCM z);
563
564SCM_API int scm_is_number (SCM val);
565
b57bf272
AW
566/* If nonzero, tell gmp to use GC_malloc for its allocations. */
567SCM_API int scm_install_gmp_memory_functions;
568
102dbb6f 569SCM_INTERNAL void scm_init_numbers (void);
0f2d19dd 570
3c9a524f 571#endif /* SCM_NUMBERS_H */
89e00824
ML
572
573/*
574 Local Variables:
575 c-file-style: "gnu"
576 End:
577*/