2 ent-mpc.c -- Numeric types for SXEmacs
3 Copyright (C) 2005, 2006 Sebastian Freundt
5 Author: Sebastian Freundt
7 This file is part of SXEmacs
9 SXEmacs is free software: you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
14 SXEmacs is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with this program. If not, see <http://www.gnu.org/licenses/>. */
27 #include "sysproc.h" /* For qxe_getpid */
33 bigc ent_scratch_bigc;
34 static ase_nullary_operation_f Qent_mpc_zero, Qent_mpc_one;
38 bigc_print (Lisp_Object obj, Lisp_Object printcharfun, int SXE_UNUSED(escapeflag))
40 Bufbyte *fstr = bigc_to_string(XBIGC_DATA(obj), 10);
41 write_c_string((char*)fstr, printcharfun);
43 fstr = (Bufbyte *)NULL;
48 bigc_equal (Lisp_Object obj1, Lisp_Object obj2, int SXE_UNUSED(depth))
50 return bigc_eq(XBIGC_DATA(obj1), XBIGC_DATA(obj2));
54 bigc_hash (Lisp_Object obj, int SXE_UNUSED(depth))
56 return bigc_hashcode(XBIGC_DATA(obj));
60 bigc_mark (Lisp_Object SXE_UNUSED(obj))
66 bigc_finalise (void *SXE_UNUSED(header), int for_disksave)
70 ("Can't dump an emacs containing MPC objects",Qt);
73 static const struct lrecord_description bigc_description[] = {
74 { XD_OPAQUE_DATA_PTR, offsetof(Lisp_Bigc, data) },
78 #if ! defined(HAVE_MPC_SET_UI_FR) || ! HAVE_MPC_SET_UI_FR
79 #if defined(MPC_SET_X_Y)
80 int mpc_set_ui_fr (mpc_t rop, unsigned long int re, mpfr_t im, mpc_rnd_t rnd)
81 MPC_SET_X_Y (ui, fr, rop, re, im, rnd);
83 #error Cannot derived mpc_set_ui_fr without MPC_SET_X_Y!
87 DEFINE_BASIC_LRECORD_IMPLEMENTATION("bigc", bigc,
88 bigc_mark, bigc_print, bigc_finalise,
89 bigc_equal, bigc_hash,
90 bigc_description, Lisp_Bigc);
94 DEFUN ("bigc-get-precision", Fbigc_get_precision, 1, 1, 0, /*
95 Return the precision of bigc C as an integer.
100 return make_integer((signed long)XBIGC_GET_PREC(c));
103 DEFUN ("bigc-set-precision", Fbigc_set_precision, 2, 2, 0, /*
104 Set the precision of C, a bigc, to PRECISION, a nonnegative integer.
105 The new precision of C is returned. Note that the return value may differ
106 from PRECISION if the underlying library is unable to support exactly
107 PRECISION bits of precision.
114 if (INTP(precision)) {
115 prec = (XINT(precision) <= 0)
116 ? MPFR_PREC_MIN : (unsigned long)XINT(precision);
118 #if defined HAVE_MPZ && (defined WITH_GMP || defined WITH_MP)
119 else if (BIGZP(precision)) {
120 prec = bigz_fits_ulong_p(XBIGZ_DATA(precision))
121 ? bigz_to_ulong(XBIGZ_DATA(precision))
124 #endif /* HAVE_MPZ */
126 dead_wrong_type_argument(Qintegerp, c);
130 XBIGC_SET_PREC(c, prec);
131 return Fbigc_get_precision(c);
134 DEFUN ("make-bigc", Fmake_bigc, 2, 2, 0, /*
135 Return the bigc number whose real component is REAL-PART and
136 whose imaginary component is IMAGINARY-PART.
138 (real_part, imaginary_part))
142 CHECK_COMPARABLE(real_part);
143 CHECK_COMPARABLE(imaginary_part);
145 real_part = Fcoerce_number(
146 real_part, Qbigfr, Qnil);
147 imaginary_part = Fcoerce_number(
148 imaginary_part, Qbigfr, Qnil);
150 /* check if one of the components is not-a-number
151 * set both components NaN in that case
153 if (bigfr_nan_p(XBIGFR_DATA(real_part)) ||
154 bigfr_nan_p(XBIGFR_DATA(imaginary_part))) {
155 bigfr_set_nan(XBIGFR_DATA(real_part));
156 bigfr_set_nan(XBIGFR_DATA(imaginary_part));
157 } else if (bigfr_inf_p(XBIGFR_DATA(real_part)) ||
158 bigfr_inf_p(XBIGFR_DATA(imaginary_part))) {
159 bigfr_set_pinf(XBIGFR_DATA(real_part));
160 bigfr_set_pinf(XBIGFR_DATA(imaginary_part));
163 result = make_bigc_bfr(XBIGFR_DATA(real_part),
164 XBIGFR_DATA(imaginary_part),
165 internal_get_precision(Qnil));
171 int bigc_nan_p(bigc c)
173 return (bigfr_nan_p(bigc_re(c)) ||
174 bigfr_nan_p(bigc_im(c)));
177 int bigc_inf_p(bigc c)
179 return (bigfr_inf_p(bigc_re(c)) ||
180 bigfr_inf_p(bigc_im(c)));
184 Bufbyte *bigc_to_string(mpc_t c, int base)
190 /* if one of the components is infinity or not a number,
191 * just print the respective component
192 * +infinity+2i does not really make sense, that's why!
195 re_str = indef_to_string((indef)NOT_A_NUMBER);
197 } else if (bigc_inf_p(c)) {
198 re_str = indef_to_string((indef)COMPLEX_INFINITY);
201 /* fetch the components' strings */
202 re_str = bigfr_to_string(bigc_re(c), base);
203 im_str = bigfr_to_string(bigc_im(c), base);
205 re_len = strlen((char*)re_str);
206 im_len = strlen((char*)im_str);
208 const int sign = bigfr_sign(bigc_im(c));
209 const int neg = (sign >= 0) ? 1 : 0;
211 /* now append the imaginary string */
212 XREALLOC_ARRAY(re_str, Bufbyte, re_len + neg + im_len + 2);
214 re_str[re_len] = '+';
215 memmove(&re_str[re_len + neg],
218 re_str[re_len+neg+im_len] = 'i';
219 re_str[re_len+neg+im_len+1] = '\0';
227 void bigc_pow(bigc res, bigc g1, unsigned long g2)
229 #if defined(HAVE_MPZ) && defined(WITH_GMP)
232 bigfr binfr, resintg, resimag, tmpbz1, tmpbz2, tmpbz3, intg, imag;
244 bigfr_set_long(resintg, 0L);
245 bigfr_set_long(resimag, 0L);
247 bigfr_set(intg, bigc_re(g1));
248 bigfr_set(imag, bigc_im(g1));
250 /* we compute using the binomial coefficients */
251 for (i=0; i<=g2; i++) {
252 mpz_bin_uiui(bin, g2, i);
253 bigfr_set_bigz(binfr, bin);
255 /* real part changes */
256 bigfr_pow(tmpbz1, intg, g2-i);
257 bigfr_pow(tmpbz2, imag, i);
258 bigfr_mul(tmpbz3, tmpbz1, tmpbz2);
259 bigfr_mul(binfr, binfr, tmpbz3);
261 bigfr_add(resintg, resintg, binfr);
262 } else if (i % 4 == 2) {
263 bigfr_sub(resintg, resintg, binfr);
266 /* imag part changes */
267 bigfr_pow(tmpbz1, intg, g2-i);
268 bigfr_pow(tmpbz2, imag, i);
269 bigfr_mul(tmpbz3, tmpbz1, tmpbz2);
270 bigfr_mul(binfr, binfr, tmpbz3);
272 bigfr_add(resimag, resimag, binfr);
273 } else if (i % 4 == 3) {
274 bigfr_sub(resimag, resimag, binfr);
279 bigc_set_bigfr_bigfr(res, resintg, resimag);
290 #else /* !WITH_GMP */
291 bigc_set_long_long(res, 0L, 0L);
292 #endif /* WITH_GMP */
298 ent_mpc_zerop(Lisp_Object l)
300 return (bigfr_sign(bigc_re(XBIGC_DATA(l))) == 0 &&
301 bigfr_sign(bigc_im(XBIGC_DATA(l))) == 0);
305 ent_mpc_onep(Lisp_Object l)
307 return (bigfr_to_fpfloat(bigc_re(XBIGC_DATA(l))) == 1.0f &&
308 bigfr_sign(bigc_im(XBIGC_DATA(l))) == 0);
312 ent_mpc_unitp(Lisp_Object SXE_UNUSED(unused))
318 ent_sum_BIGC_T(Lisp_Object l, Lisp_Object r)
320 bigc_set_prec(ent_scratch_bigc,
321 max(XBIGC_GET_PREC(l), XBIGC_GET_PREC(r)));
322 bigc_add(ent_scratch_bigc, XBIGC_DATA(l), XBIGC_DATA(r));
323 return make_bigc_bc(ent_scratch_bigc);
327 ent_sum_BIGC_T_COMPARABLE(Lisp_Object l, Lisp_Object r)
329 struct ent_lift_args_s la;
333 la.precision = XBIGC_GET_PREC(l);
334 r = ent_lift(r, BIGFR_T, &la);
336 bigc_set_prec(ent_scratch_bigc, XBIGC_GET_PREC(l));
337 bigc_set_bigfr(ent_scratch_bigc, XBIGFR_DATA(r));
338 bigc_add(ent_scratch_bigc, XBIGC_DATA(l), ent_scratch_bigc);
339 return make_bigc_bc(ent_scratch_bigc);
343 ent_sum_COMPARABLE_BIGC_T(Lisp_Object l, Lisp_Object r)
345 return ent_sum_BIGC_T_COMPARABLE(r, l);
349 ent_sum_BIGC_T_COMPLEX(Lisp_Object l, Lisp_Object r)
351 struct ent_lift_args_s la;
355 la.precision = XBIGC_GET_PREC(l);
356 r = ent_lift(r, BIGC_T, &la);
358 return ent_sum_BIGC_T(l, r);
362 ent_sum_COMPLEX_BIGC_T(Lisp_Object l, Lisp_Object r)
364 return ent_sum_BIGC_T_COMPLEX(r, l);
368 ent_diff_BIGC_T(Lisp_Object l, Lisp_Object r)
370 bigc_set_prec(ent_scratch_bigc,
371 max(XBIGC_GET_PREC(l), XBIGC_GET_PREC(r)));
372 bigc_sub(ent_scratch_bigc, XBIGC_DATA(l), XBIGC_DATA(r));
373 return make_bigc_bc(ent_scratch_bigc);
377 ent_diff_BIGC_T_COMPARABLE(Lisp_Object l, Lisp_Object r)
379 struct ent_lift_args_s la;
383 la.precision = XBIGC_GET_PREC(l);
384 r = ent_lift(r, BIGFR_T, &la);
386 bigc_set_prec(ent_scratch_bigc, XBIGC_GET_PREC(l));
387 bigc_set_bigfr(ent_scratch_bigc, XBIGFR_DATA(r));
388 bigc_sub(ent_scratch_bigc, XBIGC_DATA(l), ent_scratch_bigc);
389 return make_bigc_bc(ent_scratch_bigc);
393 ent_diff_COMPARABLE_BIGC_T(Lisp_Object l, Lisp_Object r)
395 struct ent_lift_args_s la;
399 la.precision = XBIGC_GET_PREC(r);
400 l = ent_lift(l, BIGFR_T, &la);
402 bigc_set_prec(ent_scratch_bigc, XBIGC_GET_PREC(r));
403 bigc_set_bigfr(ent_scratch_bigc, XBIGFR_DATA(l));
404 bigc_sub(ent_scratch_bigc, ent_scratch_bigc, XBIGC_DATA(r));
405 return make_bigc_bc(ent_scratch_bigc);
409 ent_diff_BIGC_T_COMPLEX(Lisp_Object l, Lisp_Object r)
411 struct ent_lift_args_s la;
415 la.precision = XBIGC_GET_PREC(l);
416 r = ent_lift(r, BIGC_T, &la);
418 return ent_diff_BIGC_T(l, r);
422 ent_diff_COMPLEX_BIGC_T(Lisp_Object l, Lisp_Object r)
424 struct ent_lift_args_s la;
428 la.precision = XBIGC_GET_PREC(r);
429 l = ent_lift(l, BIGC_T, &la);
431 return ent_diff_BIGC_T(l, r);
435 ent_neg_BIGC_T(Lisp_Object l)
437 bigc_set_prec(ent_scratch_bigc, XBIGC_GET_PREC(l));
438 bigc_neg(ent_scratch_bigc, XBIGC_DATA(l));
439 return make_bigc_bc(ent_scratch_bigc);
443 ent_prod_BIGC_T(Lisp_Object l, Lisp_Object r)
445 bigc_set_prec(ent_scratch_bigc,
446 max(XBIGC_GET_PREC(l), XBIGC_GET_PREC(r)));
447 bigc_mul(ent_scratch_bigc, XBIGC_DATA(l), XBIGC_DATA(r));
448 return make_bigc_bc(ent_scratch_bigc);
452 ent_prod_BIGC_T_COMPARABLE(Lisp_Object l, Lisp_Object r)
454 struct ent_lift_args_s la;
458 la.precision = XBIGC_GET_PREC(l);
459 r = ent_lift(r, BIGFR_T, &la);
461 bigc_set_prec(ent_scratch_bigc, XBIGC_GET_PREC(l));
462 bigc_set_bigfr(ent_scratch_bigc, XBIGFR_DATA(r));
463 bigc_mul(ent_scratch_bigc, XBIGC_DATA(l), ent_scratch_bigc);
464 return make_bigc_bc(ent_scratch_bigc);
468 ent_prod_COMPARABLE_BIGC_T(Lisp_Object l, Lisp_Object r)
470 return ent_prod_BIGC_T_COMPARABLE(r, l);
474 ent_prod_BIGC_T_COMPLEX(Lisp_Object l, Lisp_Object r)
476 struct ent_lift_args_s la;
480 la.precision = XBIGC_GET_PREC(l);
481 r = ent_lift(r, BIGC_T, &la);
483 return ent_prod_BIGC_T(l, r);
487 ent_prod_COMPLEX_BIGC_T(Lisp_Object l, Lisp_Object r)
489 return ent_prod_BIGC_T_COMPLEX(r, l);
493 ent_div_BIGC_T(Lisp_Object l, Lisp_Object r)
495 if (ent_mpc_zerop(r)) {
496 if (!ent_mpc_zerop(l)) {
497 return make_indef(COMPLEX_INFINITY);
499 return make_indef(NOT_A_NUMBER);
502 bigc_set_prec(ent_scratch_bigc,
503 max(XBIGC_GET_PREC(l), XBIGC_GET_PREC(r)));
504 bigc_div(ent_scratch_bigc, XBIGC_DATA(l), XBIGC_DATA(r));
505 return make_bigc_bc(ent_scratch_bigc);
509 ent_div_BIGC_T_COMPARABLE(Lisp_Object l, Lisp_Object r)
511 struct ent_lift_args_s la;
515 if (ent_unrel(ASE_UNARY_REL_ZEROP, r)) {
516 if (!ent_mpc_zerop(l)) {
517 return make_indef(COMPLEX_INFINITY);
519 return make_indef(NOT_A_NUMBER);
523 la.precision = XBIGC_GET_PREC(l);
524 r = ent_lift(r, BIGFR_T, &la);
526 bigc_set_prec(ent_scratch_bigc, XBIGC_GET_PREC(l));
527 bigc_set_bigfr(ent_scratch_bigc, XBIGFR_DATA(r));
528 bigc_div(ent_scratch_bigc, XBIGC_DATA(l), ent_scratch_bigc);
529 return make_bigc_bc(ent_scratch_bigc);
533 ent_div_COMPARABLE_BIGC_T(Lisp_Object l, Lisp_Object r)
535 struct ent_lift_args_s la;
539 if (ent_mpc_zerop(r)) {
540 if (!ent_unrel(ASE_UNARY_REL_ZEROP, l)) {
541 return make_indef(COMPLEX_INFINITY);
543 return make_indef(NOT_A_NUMBER);
547 la.precision = XBIGC_GET_PREC(r);
548 l = ent_lift(l, BIGFR_T, &la);
550 bigc_set_prec(ent_scratch_bigc, XBIGC_GET_PREC(r));
551 bigc_set_bigfr(ent_scratch_bigc, XBIGFR_DATA(l));
552 bigc_div(ent_scratch_bigc, ent_scratch_bigc, XBIGC_DATA(r));
553 return make_bigc_bc(ent_scratch_bigc);
557 ent_div_BIGC_T_COMPLEX(Lisp_Object l, Lisp_Object r)
559 struct ent_lift_args_s la;
563 if (ent_unrel(ASE_UNARY_REL_ZEROP, r)) {
564 if (!ent_mpc_zerop(l)) {
565 return make_indef(COMPLEX_INFINITY);
567 return make_indef(NOT_A_NUMBER);
571 la.precision = XBIGC_GET_PREC(l);
572 r = ent_lift(r, BIGC_T, &la);
574 return ent_div_BIGC_T(l, r);
578 ent_div_COMPLEX_BIGC_T(Lisp_Object l, Lisp_Object r)
580 struct ent_lift_args_s la;
584 if (ent_mpc_zerop(r)) {
585 if (!ent_unrel(ASE_UNARY_REL_ZEROP, l)) {
586 return make_indef(COMPLEX_INFINITY);
588 return make_indef(NOT_A_NUMBER);
592 la.precision = XBIGC_GET_PREC(r);
593 l = ent_lift(l, BIGC_T, &la);
595 return ent_div_BIGC_T(l, r);
599 ent_inv_BIGC_T(Lisp_Object r)
601 if (ent_mpc_zerop(r)) {
602 return make_indef(COMPLEX_INFINITY);
604 bigc_set_long(ent_scratch_bigc, 1L);
605 bigc_set_prec(ent_scratch_bigc, XBIGC_GET_PREC(r));
606 bigc_div(ent_scratch_bigc, ent_scratch_bigc, XBIGC_DATA(r));
607 return make_bigc_bc(ent_scratch_bigc);
611 ent_rem_BIGC_T(Lisp_Object SXE_UNUSED(unused), Lisp_Object r)
613 return Qent_mpc_zero;
617 ent_mod_BIGC_T(Lisp_Object l, Lisp_Object r)
619 if (ent_mpc_zerop(r)) {
620 return Qent_mpc_zero;
622 bigc_set_prec(ent_scratch_bigc,
623 max(XBIGC_GET_PREC(l), XBIGC_GET_PREC(r)));
624 bigc_div(ent_scratch_bigc, XBIGC_DATA(l), XBIGC_DATA(r));
625 bigfr_trunc(bigc_re(ent_scratch_bigc), bigc_re(ent_scratch_bigc));
626 bigfr_trunc(bigc_im(ent_scratch_bigc), bigc_im(ent_scratch_bigc));
627 bigc_mul(ent_scratch_bigc, ent_scratch_bigc, XBIGC_DATA(r));
628 bigc_sub(ent_scratch_bigc, XBIGC_DATA(l), ent_scratch_bigc);
629 return make_bigc_bc(ent_scratch_bigc);
634 ent_eq_BIGC_T(Lisp_Object l, Lisp_Object r)
636 return (bigfr_eq(bigc_re(XBIGC_DATA(l)), bigc_re(XBIGC_DATA(r))) &&
637 bigfr_eq(bigc_im(XBIGC_DATA(l)), bigc_im(XBIGC_DATA(r))));
641 ent_ne_BIGC_T(Lisp_Object l, Lisp_Object r)
643 return (bigfr_eq(bigc_re(XBIGC_DATA(l)), bigc_re(XBIGC_DATA(r))) &&
644 bigfr_eq(bigc_im(XBIGC_DATA(l)), bigc_im(XBIGC_DATA(r))));
648 static inline Lisp_Object
649 ent_vallt_BIGC_T(Lisp_Object l, Lisp_Object r)
655 bigfr_set_prec(ent_scratch_bigfr, internal_get_precision(Qnil));
656 bigfr_set_prec(b2, internal_get_precision(Qnil));
657 bigc_norm(ent_scratch_bigfr, XBIGC_DATA(l));
658 bigc_norm(b2, XBIGC_DATA(r));
659 result = bigfr_lt(ent_scratch_bigfr, b2);
662 return (result) ? Qt : Qnil;
664 static inline Lisp_Object
665 ent_valgt_BIGC_T(Lisp_Object l, Lisp_Object r)
671 bigfr_set_prec(ent_scratch_bigfr, internal_get_precision(Qnil));
672 bigfr_set_prec(b2, internal_get_precision(Qnil));
673 bigc_norm(ent_scratch_bigfr, XBIGC_DATA(l));
674 bigc_norm(b2, XBIGC_DATA(r));
675 result = bigfr_gt(ent_scratch_bigfr, b2);
678 return (result) ? Qt : Qnil;
680 static inline Lisp_Object
681 ent_valeq_BIGC_T(Lisp_Object l, Lisp_Object r)
687 bigfr_set_prec(ent_scratch_bigfr, internal_get_precision(Qnil));
688 bigfr_set_prec(b2, internal_get_precision(Qnil));
689 bigc_norm(ent_scratch_bigfr, XBIGC_DATA(l));
690 bigc_norm(b2, XBIGC_DATA(r));
691 result = bigfr_eq(ent_scratch_bigfr, b2);
694 return (result) ? Qt : Qnil;
696 static inline Lisp_Object
697 ent_valne_BIGC_T(Lisp_Object l, Lisp_Object r)
703 bigfr_set_prec(ent_scratch_bigfr, internal_get_precision(Qnil));
704 bigfr_set_prec(b2, internal_get_precision(Qnil));
705 bigc_norm(ent_scratch_bigfr, XBIGC_DATA(l));
706 bigc_norm(b2, XBIGC_DATA(r));
707 result = bigfr_eq(ent_scratch_bigfr, b2);
710 return (result) ? Qnil : Qt;
716 ent_lift_INT_T_BIGC_T(Lisp_Object number, ent_lift_args_t la)
718 unsigned long precision = la->precision;
720 bigc_set_prec(ent_scratch_bigc, precision);
721 bigc_set_long(ent_scratch_bigc, ent_int(number));
722 return make_bigc_bc(ent_scratch_bigc);
725 #if defined HAVE_MPZ && (defined WITH_GMP || defined WITH_MP)
727 ent_lift_BIGZ_T_BIGC_T(Lisp_Object number, ent_lift_args_t la)
729 unsigned long precision = la->precision;
731 bigfr_set_prec(ent_scratch_bigfr, precision);
732 bigfr_set_bigz(ent_scratch_bigfr, XBIGZ_DATA(number));
733 bigc_set_prec(ent_scratch_bigc, precision);
734 bigc_set_bigfr(ent_scratch_bigc, ent_scratch_bigfr);
735 return make_bigc_bc(ent_scratch_bigc);
737 #endif /* HAVE_MPZ */
739 #if defined HAVE_MPQ && defined WITH_GMP
741 ent_lift_BIGQ_T_BIGC_T(Lisp_Object number, ent_lift_args_t la)
743 unsigned long precision = la->precision;
745 bigfr_set_prec(ent_scratch_bigfr, precision);
746 bigfr_set_bigq(ent_scratch_bigfr, XBIGQ_DATA(number));
747 bigc_set_prec(ent_scratch_bigc, precision);
748 bigc_set_bigfr(ent_scratch_bigc, ent_scratch_bigfr);
749 return make_bigc_bc(ent_scratch_bigc);
751 #endif /* HAVE_MPQ */
753 #if defined HAVE_MPF && defined WITH_GMP
755 ent_lift_BIGF_T_BIGC_T(Lisp_Object number, ent_lift_args_t la)
757 unsigned long precision = la->precision;
759 bigfr_set_prec(ent_scratch_bigfr, precision);
760 bigfr_set_bigf(ent_scratch_bigfr, XBIGF_DATA(number));
761 bigc_set_prec(ent_scratch_bigc, precision);
762 bigc_set_bigfr(ent_scratch_bigc, ent_scratch_bigfr);
763 return make_bigc_bc(ent_scratch_bigc);
765 #endif /* HAVE_MPF */
767 #if defined HAVE_MPFR && defined WITH_MPFR
769 ent_lift_BIGFR_T_BIGC_T(Lisp_Object number, ent_lift_args_t la)
771 unsigned long precision = la->precision;
773 /* warn about coercions of indefinite symbols */
774 if (bigfr_inf_p(XBIGFR_DATA(number)))
775 return make_indef(COMPLEX_INFINITY);
776 if (bigfr_nan_p(XBIGFR_DATA(number)))
777 return make_indef(NOT_A_NUMBER);
779 bigc_set_prec(ent_scratch_bigc, precision);
780 bigc_set_bigfr(ent_scratch_bigc, XBIGFR_DATA(number));
781 return make_bigc_bc(ent_scratch_bigc);
783 #endif /* HAVE_MPF */
787 ent_lift_FLOAT_T_BIGC_T(Lisp_Object number, ent_lift_args_t la)
789 unsigned long precision = la->precision;
791 bigc_set_prec(ent_scratch_bigc, precision);
792 bigc_set_fpfloat(ent_scratch_bigc, XFLOAT_DATA(number));
793 return make_bigc_bc(ent_scratch_bigc);
797 #if defined HAVE_PSEUG && defined WITH_PSEUG
799 ent_lift_BIGG_T_BIGC_T(Lisp_Object number, ent_lift_args_t la)
801 unsigned long precision = la->precision;
802 bigfr bfr_im, bfr_re;
803 Lisp_Object result, re, im;
805 re = Freal_part(number);
806 re = ent_lift(re, BIGFR_T, la);
807 im = Fimaginary_part(number);
808 im = ent_lift(im, BIGFR_T, la);
813 bigfr_set(bfr_re, XBIGFR_DATA(re));
814 bigfr_set(bfr_im, XBIGFR_DATA(im));
815 result = make_bigc_bfr(bfr_re, bfr_im, precision);
825 ent_lift_BIGC_T_BIGC_T(Lisp_Object number, ent_lift_args_t la)
827 unsigned long precision = la->precision;
829 bigc_set_prec(ent_scratch_bigc, precision);
830 bigc_set(ent_scratch_bigc, XBIGC_DATA(number));
831 return make_bigc_bc(ent_scratch_bigc);
836 ent_mpc_nullary_optable_init(void)
838 Qent_mpc_zero = make_bigc(0.0f, 0.0f, internal_get_precision(Qnil));
839 Qent_mpc_one = make_bigc(1.0f, 0.0f, internal_get_precision(Qnil));
840 staticpro(&Qent_mpc_zero);
841 staticpro(&Qent_mpc_one);
843 ent_nullop_register(ASE_NULLARY_OP_ZERO, BIGC_T, Qent_mpc_zero);
844 ent_nullop_register(ASE_NULLARY_OP_ONE, BIGC_T, Qent_mpc_one);
848 ent_mpc_unary_optable_init(void)
850 ent_unop_register(ASE_UNARY_OP_NEG, BIGC_T, ent_neg_BIGC_T);
851 ent_unop_register(ASE_UNARY_OP_INV, BIGC_T, ent_inv_BIGC_T);
855 ent_mpc_binary_optable_init(void)
858 ent_binop_register(ASE_BINARY_OP_SUM,
859 BIGC_T, BIGC_T, ent_sum_BIGC_T);
860 ent_binop_register(ASE_BINARY_OP_SUM,
861 BIGC_T, INT_T, ent_sum_BIGC_T_COMPARABLE);
862 ent_binop_register(ASE_BINARY_OP_SUM,
863 INT_T, BIGC_T, ent_sum_COMPARABLE_BIGC_T);
864 #if defined HAVE_MPZ && (defined WITH_GMP || defined WITH_MP)
865 ent_binop_register(ASE_BINARY_OP_SUM,
866 BIGC_T, BIGZ_T, ent_sum_BIGC_T_COMPARABLE);
867 ent_binop_register(ASE_BINARY_OP_SUM,
868 BIGZ_T, BIGC_T, ent_sum_COMPARABLE_BIGC_T);
870 #if defined HAVE_MPQ && defined WITH_GMP
871 ent_binop_register(ASE_BINARY_OP_SUM,
872 BIGC_T, BIGQ_T, ent_sum_BIGC_T_COMPARABLE);
873 ent_binop_register(ASE_BINARY_OP_SUM,
874 BIGQ_T, BIGC_T, ent_sum_COMPARABLE_BIGC_T);
876 #if defined HAVE_MPF && defined WITH_GMP
877 ent_binop_register(ASE_BINARY_OP_SUM,
878 BIGC_T, BIGF_T, ent_sum_BIGC_T_COMPARABLE);
879 ent_binop_register(ASE_BINARY_OP_SUM,
880 BIGF_T, BIGC_T, ent_sum_COMPARABLE_BIGC_T);
882 #if defined HAVE_MPFR && defined WITH_MPFR
883 ent_binop_register(ASE_BINARY_OP_SUM,
884 BIGC_T, BIGFR_T, ent_sum_BIGC_T_COMPARABLE);
885 ent_binop_register(ASE_BINARY_OP_SUM,
886 BIGFR_T, BIGC_T, ent_sum_COMPARABLE_BIGC_T);
889 ent_binop_register(ASE_BINARY_OP_SUM,
890 BIGC_T, FLOAT_T, ent_sum_BIGC_T_COMPARABLE);
891 ent_binop_register(ASE_BINARY_OP_SUM,
892 FLOAT_T, BIGC_T, ent_sum_COMPARABLE_BIGC_T);
894 #if defined HAVE_PSEUG && defined WITH_PSEUG
895 ent_binop_register(ASE_BINARY_OP_SUM,
896 BIGC_T, BIGG_T, ent_sum_BIGC_T_COMPLEX);
897 ent_binop_register(ASE_BINARY_OP_SUM,
898 BIGG_T, BIGC_T, ent_sum_COMPLEX_BIGC_T);
901 ent_binop_register(ASE_BINARY_OP_DIFF,
902 BIGC_T, BIGC_T, ent_diff_BIGC_T);
903 ent_binop_register(ASE_BINARY_OP_DIFF,
904 BIGC_T, INT_T, ent_diff_BIGC_T_COMPARABLE);
905 ent_binop_register(ASE_BINARY_OP_DIFF,
906 INT_T, BIGC_T, ent_diff_COMPARABLE_BIGC_T);
907 #if defined HAVE_MPZ && (defined WITH_GMP || defined WITH_MP)
908 ent_binop_register(ASE_BINARY_OP_DIFF,
909 BIGC_T, BIGZ_T, ent_diff_BIGC_T_COMPARABLE);
910 ent_binop_register(ASE_BINARY_OP_DIFF,
911 BIGZ_T, BIGC_T, ent_diff_COMPARABLE_BIGC_T);
913 #if defined HAVE_MPQ && defined WITH_GMP
914 ent_binop_register(ASE_BINARY_OP_DIFF,
915 BIGC_T, BIGQ_T, ent_diff_BIGC_T_COMPARABLE);
916 ent_binop_register(ASE_BINARY_OP_DIFF,
917 BIGQ_T, BIGC_T, ent_diff_COMPARABLE_BIGC_T);
919 #if defined HAVE_MPF && defined WITH_GMP
920 ent_binop_register(ASE_BINARY_OP_DIFF,
921 BIGC_T, BIGF_T, ent_diff_BIGC_T_COMPARABLE);
922 ent_binop_register(ASE_BINARY_OP_DIFF,
923 BIGF_T, BIGC_T, ent_diff_COMPARABLE_BIGC_T);
925 #if defined HAVE_MPFR && defined WITH_MPFR
926 ent_binop_register(ASE_BINARY_OP_DIFF,
927 BIGC_T, BIGFR_T, ent_diff_BIGC_T_COMPARABLE);
928 ent_binop_register(ASE_BINARY_OP_DIFF,
929 BIGFR_T, BIGC_T, ent_diff_COMPARABLE_BIGC_T);
932 ent_binop_register(ASE_BINARY_OP_DIFF,
933 BIGC_T, FLOAT_T, ent_diff_BIGC_T_COMPARABLE);
934 ent_binop_register(ASE_BINARY_OP_DIFF,
935 FLOAT_T, BIGC_T, ent_diff_COMPARABLE_BIGC_T);
937 #if defined HAVE_PSEUG && defined WITH_PSEUG
938 ent_binop_register(ASE_BINARY_OP_DIFF,
939 BIGC_T, BIGG_T, ent_diff_BIGC_T_COMPLEX);
940 ent_binop_register(ASE_BINARY_OP_DIFF,
941 BIGG_T, BIGC_T, ent_diff_COMPLEX_BIGC_T);
944 ent_binop_register(ASE_BINARY_OP_PROD,
945 BIGC_T, BIGC_T, ent_prod_BIGC_T);
946 ent_binop_register(ASE_BINARY_OP_PROD,
947 BIGC_T, INT_T, ent_prod_BIGC_T_COMPARABLE);
948 ent_binop_register(ASE_BINARY_OP_PROD,
949 INT_T, BIGC_T, ent_prod_COMPARABLE_BIGC_T);
950 #if defined HAVE_MPZ && (defined WITH_GMP || defined WITH_MP)
951 ent_binop_register(ASE_BINARY_OP_PROD,
952 BIGC_T, BIGZ_T, ent_prod_BIGC_T_COMPARABLE);
953 ent_binop_register(ASE_BINARY_OP_PROD,
954 BIGZ_T, BIGC_T, ent_prod_COMPARABLE_BIGC_T);
956 #if defined HAVE_MPQ && defined WITH_GMP
957 ent_binop_register(ASE_BINARY_OP_PROD,
958 BIGC_T, BIGQ_T, ent_prod_BIGC_T_COMPARABLE);
959 ent_binop_register(ASE_BINARY_OP_PROD,
960 BIGQ_T, BIGC_T, ent_prod_COMPARABLE_BIGC_T);
962 #if defined HAVE_MPF && defined WITH_GMP
963 ent_binop_register(ASE_BINARY_OP_PROD,
964 BIGC_T, BIGF_T, ent_prod_BIGC_T_COMPARABLE);
965 ent_binop_register(ASE_BINARY_OP_PROD,
966 BIGF_T, BIGC_T, ent_prod_COMPARABLE_BIGC_T);
968 #if defined HAVE_MPFR && defined WITH_MPFR
969 ent_binop_register(ASE_BINARY_OP_PROD,
970 BIGC_T, BIGFR_T, ent_prod_BIGC_T_COMPARABLE);
971 ent_binop_register(ASE_BINARY_OP_PROD,
972 BIGFR_T, BIGC_T, ent_prod_COMPARABLE_BIGC_T);
975 ent_binop_register(ASE_BINARY_OP_PROD,
976 BIGC_T, FLOAT_T, ent_prod_BIGC_T_COMPARABLE);
977 ent_binop_register(ASE_BINARY_OP_PROD,
978 FLOAT_T, BIGC_T, ent_prod_COMPARABLE_BIGC_T);
980 #if defined HAVE_PSEUG && defined WITH_PSEUG
981 ent_binop_register(ASE_BINARY_OP_PROD,
982 BIGC_T, BIGG_T, ent_prod_BIGC_T_COMPLEX);
983 ent_binop_register(ASE_BINARY_OP_PROD,
984 BIGG_T, BIGC_T, ent_prod_COMPLEX_BIGC_T);
987 /* divisions and quotients */
988 ent_binop_register(ASE_BINARY_OP_DIV,
989 BIGC_T, BIGC_T, ent_div_BIGC_T);
990 ent_binop_register(ASE_BINARY_OP_DIV,
991 BIGC_T, INT_T, ent_div_BIGC_T_COMPARABLE);
992 ent_binop_register(ASE_BINARY_OP_DIV,
993 INT_T, BIGC_T, ent_div_COMPARABLE_BIGC_T);
994 #if defined HAVE_MPZ && (defined WITH_GMP || defined WITH_MP)
995 ent_binop_register(ASE_BINARY_OP_DIV,
996 BIGC_T, BIGZ_T, ent_div_BIGC_T_COMPARABLE);
997 ent_binop_register(ASE_BINARY_OP_DIV,
998 BIGZ_T, BIGC_T, ent_div_COMPARABLE_BIGC_T);
1000 #if defined HAVE_MPQ && defined WITH_GMP
1001 ent_binop_register(ASE_BINARY_OP_DIV,
1002 BIGC_T, BIGQ_T, ent_div_BIGC_T_COMPARABLE);
1003 ent_binop_register(ASE_BINARY_OP_DIV,
1004 BIGQ_T, BIGC_T, ent_div_COMPARABLE_BIGC_T);
1006 #if defined HAVE_MPF && defined WITH_GMP
1007 ent_binop_register(ASE_BINARY_OP_DIV,
1008 BIGC_T, BIGF_T, ent_div_BIGC_T_COMPARABLE);
1009 ent_binop_register(ASE_BINARY_OP_DIV,
1010 BIGF_T, BIGC_T, ent_div_COMPARABLE_BIGC_T);
1012 #if defined HAVE_MPFR && defined WITH_MPFR
1013 ent_binop_register(ASE_BINARY_OP_DIV,
1014 BIGC_T, BIGFR_T, ent_div_BIGC_T_COMPARABLE);
1015 ent_binop_register(ASE_BINARY_OP_DIV,
1016 BIGFR_T, BIGC_T, ent_div_COMPARABLE_BIGC_T);
1019 ent_binop_register(ASE_BINARY_OP_DIV,
1020 BIGC_T, FLOAT_T, ent_div_BIGC_T_COMPARABLE);
1021 ent_binop_register(ASE_BINARY_OP_DIV,
1022 FLOAT_T, BIGC_T, ent_div_COMPARABLE_BIGC_T);
1024 #if defined HAVE_PSEUG && defined WITH_PSEUG
1025 ent_binop_register(ASE_BINARY_OP_DIV,
1026 BIGC_T, BIGG_T, ent_div_BIGC_T_COMPLEX);
1027 ent_binop_register(ASE_BINARY_OP_DIV,
1028 BIGG_T, BIGC_T, ent_div_COMPLEX_BIGC_T);
1030 ent_binop_register(ASE_BINARY_OP_QUO,
1031 BIGC_T, BIGC_T, ent_div_BIGC_T);
1032 #if defined HAVE_MPZ && (defined WITH_GMP || defined WITH_MP)
1033 ent_binop_register(ASE_BINARY_OP_QUO,
1034 BIGC_T, BIGZ_T, ent_div_BIGC_T_COMPARABLE);
1035 ent_binop_register(ASE_BINARY_OP_QUO,
1036 BIGZ_T, BIGC_T, ent_div_COMPARABLE_BIGC_T);
1038 #if defined HAVE_MPQ && defined WITH_GMP
1039 ent_binop_register(ASE_BINARY_OP_QUO,
1040 BIGC_T, BIGQ_T, ent_div_BIGC_T_COMPARABLE);
1041 ent_binop_register(ASE_BINARY_OP_QUO,
1042 BIGQ_T, BIGC_T, ent_div_COMPARABLE_BIGC_T);
1044 #if defined HAVE_MPF && defined WITH_GMP
1045 ent_binop_register(ASE_BINARY_OP_QUO,
1046 BIGC_T, BIGF_T, ent_div_BIGC_T_COMPARABLE);
1047 ent_binop_register(ASE_BINARY_OP_QUO,
1048 BIGF_T, BIGC_T, ent_div_COMPARABLE_BIGC_T);
1050 #if defined HAVE_MPFR && defined WITH_MPFR
1051 ent_binop_register(ASE_BINARY_OP_QUO,
1052 BIGC_T, BIGFR_T, ent_div_BIGC_T_COMPARABLE);
1053 ent_binop_register(ASE_BINARY_OP_QUO,
1054 BIGFR_T, BIGC_T, ent_div_COMPARABLE_BIGC_T);
1057 ent_binop_register(ASE_BINARY_OP_QUO,
1058 BIGC_T, FLOAT_T, ent_div_BIGC_T_COMPARABLE);
1059 ent_binop_register(ASE_BINARY_OP_QUO,
1060 FLOAT_T, BIGC_T, ent_div_COMPARABLE_BIGC_T);
1062 #if defined HAVE_PSEUG && defined WITH_PSEUG
1063 ent_binop_register(ASE_BINARY_OP_QUO,
1064 BIGC_T, BIGG_T, ent_div_BIGC_T_COMPLEX);
1065 ent_binop_register(ASE_BINARY_OP_QUO,
1066 BIGG_T, BIGC_T, ent_div_COMPLEX_BIGC_T);
1068 ent_binop_register(ASE_BINARY_OP_REM,
1069 BIGC_T, BIGC_T, ent_rem_BIGC_T);
1070 ent_binop_register(ASE_BINARY_OP_MOD,
1071 BIGC_T, BIGC_T, ent_mod_BIGC_T);
1075 ent_mpc_unary_reltable_init(void)
1077 ent_unrel_register(ASE_UNARY_REL_ZEROP, BIGC_T, ent_mpc_zerop);
1078 ent_unrel_register(ASE_UNARY_REL_ONEP, BIGC_T, ent_mpc_onep);
1079 ent_unrel_register(ASE_UNARY_REL_UNITP, BIGC_T, ent_mpc_unitp);
1083 ent_mpc_binary_reltable_init(void)
1085 ent_binrel_register(ASE_BINARY_REL_EQUALP,
1086 BIGC_T, BIGC_T, ent_eq_BIGC_T);
1087 ent_binrel_register(ASE_BINARY_REL_NEQP,
1088 BIGC_T, BIGC_T, ent_ne_BIGC_T);
1092 ent_mpc_lifttable_init(void)
1094 ent_lift_register(INT_T, BIGC_T, ent_lift_INT_T_BIGC_T);
1095 #if defined HAVE_MPZ && (defined WITH_GMP || defined WITH_MP)
1096 ent_lift_register(BIGZ_T, BIGC_T, ent_lift_BIGZ_T_BIGC_T);
1098 #if defined HAVE_MPQ && defined WITH_GMP
1099 ent_lift_register(BIGQ_T, BIGC_T, ent_lift_BIGQ_T_BIGC_T);
1101 #if defined HAVE_MPF && defined WITH_GMP
1102 ent_lift_register(BIGF_T, BIGC_T, ent_lift_BIGF_T_BIGC_T);
1104 #if defined HAVE_MPFR && defined WITH_MPFR
1105 ent_lift_register(BIGFR_T, BIGC_T, ent_lift_BIGFR_T_BIGC_T);
1108 ent_lift_register(FLOAT_T, BIGC_T, ent_lift_FLOAT_T_BIGC_T);
1110 ent_lift_register(BIGG_T, BIGC_T, ent_lift_BIGG_T_BIGC_T);
1111 ent_lift_register(BIGC_T, BIGC_T, ent_lift_BIGC_T_BIGC_T);
1114 void init_optables_BIGC_T(void)
1116 ent_mpc_nullary_optable_init();
1117 ent_mpc_unary_optable_init();
1118 ent_mpc_binary_optable_init();
1119 ent_mpc_unary_reltable_init();
1120 ent_mpc_binary_reltable_init();
1121 ent_mpc_lifttable_init();
1124 void init_ent_mpc(void)
1126 bigc_init(ent_scratch_bigc);
1129 void syms_of_ent_mpc(void)
1131 INIT_LRECORD_IMPLEMENTATION(bigc);
1133 DEFSUBR(Fbigc_get_precision);
1134 DEFSUBR(Fbigc_set_precision);
1135 DEFSUBR(Fmake_bigc);
1138 void vars_of_ent_mpc(void)
1140 Fprovide(intern("bigc"));