2 ent-gmp.c -- Numeric types for SXEmacs
3 Copyright (C) 2004 Jerry James
4 Copyright (C) 2004, 2005, 2006 Sebastian Freundt
7 Backport: Sebastian Freundt
9 This file is part of SXEmacs
11 SXEmacs is free software: you can redistribute it and/or modify
12 it under the terms of the GNU General Public License as published by
13 the Free Software Foundation, either version 3 of the License, or
14 (at your option) any later version.
16 SXEmacs is distributed in the hope that it will be useful,
17 but WITHOUT ANY WARRANTY; without even the implied warranty of
18 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 GNU General Public License for more details.
21 You should have received a copy of the GNU General Public License
22 along with this program. If not, see <http://www.gnu.org/licenses/>. */
29 #include "sysproc.h" /* For qxe_getpid */
33 static mpf_t float_print_min, float_print_max;
34 gmp_randstate_t random_state;
36 bigz ent_scratch_bigz;
37 bigq ent_scratch_bigq;
38 bigf ent_scratch_bigf;
40 static ase_nullary_operation_f Qent_mpz_zero, Qent_mpz_one;
41 static ase_nullary_operation_f Qent_mpq_zero, Qent_mpq_one;
42 static ase_nullary_operation_f Qent_mpf_zero, Qent_mpf_one;
45 #define yrealloc_array(ptr, type, len) \
46 ((void)(ptr = (type*)yrealloc(ptr, (len) * sizeof(type))))
50 /************************* Big Rational Integers ****************************/
52 bigz_print (Lisp_Object obj, Lisp_Object printcharfun, int UNUSED(escapeflag))
56 bstr = (Bufbyte*)bigz_to_string(XBIGZ_DATA(obj), 10);
57 write_c_string((char*)bstr, printcharfun);
59 bstr = (Bufbyte *)NULL;
63 bigz_equal (Lisp_Object obj1, Lisp_Object obj2, int UNUSED(depth))
65 return bigz_eql(XBIGZ_DATA(obj1), XBIGZ_DATA(obj2));
69 bigz_hash (Lisp_Object obj, int UNUSED(depth))
71 return (unsigned long)bigz_hashcode(XBIGZ_DATA(obj));
74 static const struct lrecord_description bigz_description[] = {
75 { XD_OPAQUE_DATA_PTR, offsetof(Lisp_Bigz, data) },
79 DEFINE_BASIC_LRECORD_IMPLEMENTATION("bigz", bigz,
80 NULL, bigz_print, NULL,
81 bigz_equal, bigz_hash,
82 bigz_description, Lisp_Bigz);
85 /************************** Rational Integer Fractions **********************/
87 bigq_print (Lisp_Object obj, Lisp_Object printcharfun, int UNUSED(escapeflag))
91 rstr = (Bufbyte*)bigq_to_string(XBIGQ_DATA(obj), 10);
92 write_c_string((char *)rstr, printcharfun);
94 rstr = (Bufbyte *)NULL;
99 bigq_equal (Lisp_Object obj1, Lisp_Object obj2, int UNUSED(depth))
101 return bigq_eql(XBIGQ_DATA(obj1), XBIGQ_DATA(obj2));
105 bigq_hash (Lisp_Object obj, int UNUSED(depth))
107 return bigq_hashcode(XBIGQ_DATA(obj));
110 static const struct lrecord_description bigq_description[] = {
111 { XD_OPAQUE_DATA_PTR, offsetof (Lisp_Bigq, data) },
115 DEFINE_BASIC_LRECORD_IMPLEMENTATION("bigq", bigq,
116 NULL, bigq_print, NULL,
117 bigq_equal, bigq_hash,
118 bigq_description, Lisp_Bigq);
121 /********************************** Bigfs ***********************************/
123 bigf_print(Lisp_Object obj, Lisp_Object printcharfun, int UNUSED(escapeflag))
125 Bufbyte *fstr = bigf_to_string(XBIGF_DATA(obj), 10);
126 write_c_string((char*)fstr, printcharfun);
128 fstr = (Bufbyte *)NULL;
133 bigf_equal(Lisp_Object obj1, Lisp_Object obj2, int UNUSED(depth))
135 return bigf_eq(XBIGF_DATA(obj1), XBIGF_DATA(obj2));
139 bigf_hash(Lisp_Object obj, int UNUSED(depth))
141 return bigf_hashcode(XBIGF_DATA(obj));
144 static const struct lrecord_description bigf_description[] = {
145 { XD_OPAQUE_DATA_PTR, offsetof(Lisp_Bigf, data) },
149 DEFINE_BASIC_LRECORD_IMPLEMENTATION("bigf", bigf,
150 NULL, bigf_print, NULL,
151 bigf_equal, bigf_hash,
152 bigf_description, Lisp_Bigf);
154 DEFUN("bigf-get-precision", Fbigf_get_precision, 1, 1, 0, /*
155 Return the precision of bigf F as an integer.
160 return make_integer((signed long)XBIGF_GET_PREC(f));
163 DEFUN("bigf-set-precision", Fbigf_set_precision, 2, 2, 0, /*
164 Set the precision of F, a bigf, to PRECISION, a nonnegative integer.
165 The new precision of F is returned. Note that the return value may differ
166 from PRECISION if the underlying library is unable to support exactly
167 PRECISION bits of precision.
174 if (INTP(precision)) {
175 prec = (XINT(precision) <= 0)
176 ? 1UL : (unsigned long)XINT(precision);
179 else if (BIGZP(precision)) {
180 prec = bigz_fits_ulong_p(XBIGZ_DATA(precision))
181 ? bigz_to_ulong(XBIGZ_DATA(precision))
184 #endif /* HAVE_MPZ */
186 dead_wrong_type_argument(Qintegerp, f);
190 XBIGF_SET_PREC(f, prec);
191 return Fbigf_get_precision(f);
197 bigf_to_string(mpf_t f, int base)
200 Bufbyte *str = (Bufbyte*)mpf_get_str(NULL, &expt, base, 0, f);
201 const int sign = mpf_sgn(f);
202 const int neg = (sign < 0) ? 1 : 0;
203 int len = strlen((char *)str) + 1; /* Count the null terminator */
205 /* Move digits down to insert a radix point */
207 /* We need room for a radix point and leading zeroes */
208 const int space = -expt + 2;
209 xrealloc_array(str, Bufbyte, len + space);
210 memmove(&str[space + neg], &str[neg], len - neg);
211 memset(&str[neg], '0', space);
214 } else if (expt < len) {
215 /* We just need room for a radix point */
216 xrealloc_array(str, Bufbyte, len + 1);
217 memmove(&str[expt + neg + 1],
220 str[expt + neg] = '.';
223 /* We need room for trailing zeroes */
224 xrealloc_array(str, Bufbyte, expt + 1);
225 memset(&str[len-1], '0', expt+2-len);
230 /* never want this here */
231 /* Computerized scientific notation */
232 /* We need room for a radix point, format identifier, and exponent */
233 const int space = (expt < 0)
234 ? (int)(log(-expt) / log(base)) + 3
235 : (int)(log(expt) / log(base)) + 2;
236 xrealloc_array(str, Bufbyte, len + space);
237 memmove(&str[neg + 2], &str[neg + 1], len - neg);
239 sprintf ((char *)&str[len + 2], "%ld", expt);
249 read_bigz_string(const char *cp, int base)
256 /* MPZ bigz_set_string has no effect
257 * with initial + sign */
262 bigz_set_string(bz, (const char*)cp, base);
263 result = make_bigz_bz(bz);
270 Lisp_Object read_bigq_string(char *cp)
277 /* The GMP version of bigq_set_string (mpq_set_str) has the following
279 - If p starts with a '+' sign, it does nothing; i.e., it leaves its
280 ratio argument untouched.
281 - If p has a '+' sign after the '/' (e.g., 300/+400), it sets the
282 numerator from the string, but *leaves the denominator unchanged*.
283 - If p has trailing nonnumeric characters, it sets the numerator from
284 the string, but leaves the denominator unchanged.
285 - If p has more than one '/', (e.g., 1/2/3), then it sets the
286 numerator from the string, but leaves the denominator unchanged.
288 Therefore, move p past any leading '+' signs, temporarily drop a null
289 after the numeric characters we are trying to convert, and then put
290 the nulled character back afterward. I am not going to fix problem
291 #2; just don't write ratios that look like that. */
296 bigq_set_string(bq, cp, 0);
297 bigq_canonicalize(bq);
299 result = ent_mpq_downgrade_maybe(bq);
305 Lisp_Object read_bigf_string(char *cp)
310 bigf_init_prec(bf, internal_get_precision(Qnil));
312 /* The GMP version of bigf_set_string (mpf_set_str)
313 has the following limitation: if p starts with a '+'
314 sign, it does nothing; i.e., it leaves its bigfloat
316 Therefore, move p past any leading '+' signs. */
321 bigf_set_string(bf, cp, 0);
322 result = make_bigf_bf(bf);
330 _ent_mpz_zerop(bigz n)
332 return (bigz_sign(n) == 0);
336 ent_mpz_zerop(Lisp_Object l)
338 return _ent_mpz_zerop(XBIGZ_DATA(l));
342 _ent_mpz_onep(bigz n)
344 return (bigz_fits_long_p(n) && bigz_to_long(n) == 1L);
348 ent_mpz_onep(Lisp_Object l)
350 return _ent_mpz_onep(XBIGZ_DATA(l));
354 _ent_mpz_unitp(bigz n)
356 return (bigz_fits_long_p(n) &&
357 (bigz_to_long(n) == 1L || bigz_to_long(n) == -1L));
361 ent_mpz_unitp(Lisp_Object l)
363 return _ent_mpz_unitp(XBIGZ_DATA(l));
367 ent_sum_BIGZ_T(Lisp_Object l, Lisp_Object r)
369 bigz_add(ent_scratch_bigz, XBIGZ_DATA(l), XBIGZ_DATA(r));
370 return ent_mpz_downgrade_maybe(ent_scratch_bigz);
373 ent_sum_BIGZ_T_INT_T(Lisp_Object l, Lisp_Object r)
375 bigz_set_long(ent_scratch_bigz, ent_int(r));
376 bigz_add(ent_scratch_bigz, XBIGZ_DATA(l), ent_scratch_bigz);
377 return ent_mpz_downgrade_maybe(ent_scratch_bigz);
380 ent_sum_INT_T_BIGZ_T(Lisp_Object l, Lisp_Object r)
382 return ent_sum_BIGZ_T_INT_T(r, l);
386 ent_sum_BIGZ_T_FLOAT_T(Lisp_Object l, Lisp_Object r)
388 return __ent_binop_lift_1(
389 ASE_BINARY_OP_SUM, BIGZ_T, l, FLOAT_T, r, NULL);
392 ent_sum_FLOAT_T_BIGZ_T(Lisp_Object l, Lisp_Object r)
394 return __ent_binop_lift_2(
395 ASE_BINARY_OP_SUM, FLOAT_T, l, BIGZ_T, r, NULL);
400 ent_diff_BIGZ_T(Lisp_Object l, Lisp_Object r)
402 bigz_sub(ent_scratch_bigz, XBIGZ_DATA(l), XBIGZ_DATA(r));
403 return ent_mpz_downgrade_maybe(ent_scratch_bigz);
406 ent_diff_BIGZ_T_INT_T(Lisp_Object l, Lisp_Object r)
408 bigz_set_long(ent_scratch_bigz, ent_int(r));
409 bigz_sub(ent_scratch_bigz, XBIGZ_DATA(l), ent_scratch_bigz);
410 return ent_mpz_downgrade_maybe(ent_scratch_bigz);
413 ent_diff_INT_T_BIGZ_T(Lisp_Object l, Lisp_Object r)
415 bigz_set_long(ent_scratch_bigz, ent_int(l));
416 bigz_sub(ent_scratch_bigz, ent_scratch_bigz, XBIGZ_DATA(r));
417 return ent_mpz_downgrade_maybe(ent_scratch_bigz);
421 ent_diff_BIGZ_T_FLOAT_T(Lisp_Object l, Lisp_Object r)
423 return __ent_binop_lift_1(
424 ASE_BINARY_OP_DIFF, BIGZ_T, l, FLOAT_T, r, NULL);
427 ent_diff_FLOAT_T_BIGZ_T(Lisp_Object l, Lisp_Object r)
429 return __ent_binop_lift_2(
430 ASE_BINARY_OP_DIFF, FLOAT_T, l, BIGZ_T, r, NULL);
435 ent_neg_BIGZ_T(Lisp_Object l)
437 bigz_neg(ent_scratch_bigz, XBIGZ_DATA(l));
438 return make_bigz_bz(ent_scratch_bigz);
442 ent_prod_BIGZ_T(Lisp_Object l, Lisp_Object r)
444 bigz_mul(ent_scratch_bigz, XBIGZ_DATA(l), XBIGZ_DATA(r));
445 return ent_mpz_downgrade_maybe(ent_scratch_bigz);
448 ent_prod_BIGZ_T_INT_T(Lisp_Object l, Lisp_Object r)
450 bigz_set_long(ent_scratch_bigz, ent_int(r));
451 bigz_mul(ent_scratch_bigz, XBIGZ_DATA(l), ent_scratch_bigz);
452 return ent_mpz_downgrade_maybe(ent_scratch_bigz);
455 ent_prod_INT_T_BIGZ_T(Lisp_Object l, Lisp_Object r)
457 return ent_prod_BIGZ_T_INT_T(r, l);
461 ent_prod_BIGZ_T_FLOAT_T(Lisp_Object l, Lisp_Object r)
463 return __ent_binop_lift_1(
464 ASE_BINARY_OP_PROD, BIGZ_T, l, FLOAT_T, r, NULL);
467 ent_prod_FLOAT_T_BIGZ_T(Lisp_Object l, Lisp_Object r)
469 return __ent_binop_lift_2(
470 ASE_BINARY_OP_PROD, FLOAT_T, l, BIGZ_T, r, NULL);
475 ent_div_BIGZ_T(Lisp_Object l, Lisp_Object r)
477 if (bigz_sign(XBIGZ_DATA(r)) == 0) {
478 int lsgn = bigz_sign(XBIGZ_DATA(l));
480 return make_indef(POS_INFINITY);
482 return make_indef(NEG_INFINITY);
484 return make_indef(NOT_A_NUMBER);
486 bigz_div(ent_scratch_bigz, XBIGZ_DATA(l), XBIGZ_DATA(r));
487 return ent_mpz_downgrade_maybe(ent_scratch_bigz);
490 ent_div_BIGZ_T_INT_T(Lisp_Object l, Lisp_Object r)
492 if (ent_int(r) == 0) {
493 int lsgn = bigz_sign(XBIGZ_DATA(l));
495 return make_indef(POS_INFINITY);
497 return make_indef(NEG_INFINITY);
499 return make_indef(NOT_A_NUMBER);
502 bigz_set_long(ent_scratch_bigz, ent_int(r));
503 bigz_div(ent_scratch_bigz, XBIGZ_DATA(l), ent_scratch_bigz);
504 return ent_mpz_downgrade_maybe(ent_scratch_bigz);
507 ent_div_INT_T_BIGZ_T(Lisp_Object l, Lisp_Object r)
509 if (bigz_sign(XBIGZ_DATA(r)) == 0) {
510 EMACS_INT rl = ent_int(l);
512 return make_indef(POS_INFINITY);
514 return make_indef(NEG_INFINITY);
516 return make_indef(NOT_A_NUMBER);
519 bigz_set_long(ent_scratch_bigz, ent_int(l));
520 bigz_div(ent_scratch_bigz, ent_scratch_bigz, XBIGZ_DATA(r));
521 return ent_mpz_downgrade_maybe(ent_scratch_bigz);
525 ent_div_BIGZ_T_FLOAT_T(Lisp_Object l, Lisp_Object r)
527 return __ent_binop_lift_1(
528 ASE_BINARY_OP_DIV, BIGZ_T, l, FLOAT_T, r, NULL);
531 ent_div_FLOAT_T_BIGZ_T(Lisp_Object l, Lisp_Object r)
533 return __ent_binop_lift_2(
534 ASE_BINARY_OP_DIV, FLOAT_T, l, BIGZ_T, r, NULL);
539 ent_quo_BIGZ_T(Lisp_Object l, Lisp_Object r)
541 if (bigz_sign(XBIGZ_DATA(r)) == 0) {
542 int lsgn = bigz_sign(XBIGZ_DATA(l));
544 return make_indef(POS_INFINITY);
546 return make_indef(NEG_INFINITY);
548 return make_indef(NOT_A_NUMBER);
551 bigq_set_bigz_bigz(ent_scratch_bigq,
552 XBIGZ_DATA(l), XBIGZ_DATA(r));
553 return ent_mpq_downgrade_maybe(ent_scratch_bigq);
556 ent_quo_BIGZ_T_INT_T(Lisp_Object l, Lisp_Object r)
558 EMACS_INT rr = ent_int(r);
560 int lsgn = bigz_sign(XBIGZ_DATA(l));
562 return make_indef(POS_INFINITY);
564 return make_indef(NEG_INFINITY);
566 return make_indef(NOT_A_NUMBER);
569 bigz_set_long(ent_scratch_bigz, rr);
570 return make_bigq_bz(XBIGZ_DATA(l), ent_scratch_bigz);
573 ent_quo_INT_T_BIGZ_T(Lisp_Object l, Lisp_Object r)
575 if (bigz_sign(XBIGZ_DATA(r)) == 0) {
576 EMACS_INT rl = ent_int(l);
578 return make_indef(POS_INFINITY);
580 return make_indef(NEG_INFINITY);
582 return make_indef(NOT_A_NUMBER);
585 bigz_set_long(ent_scratch_bigz, ent_int(l));
586 return make_bigq_bz(ent_scratch_bigz, XBIGZ_DATA(r));
590 ent_inv_BIGZ_T(Lisp_Object r)
592 if (bigz_sign(XBIGZ_DATA(r)) == 0) {
593 return make_indef(POS_INFINITY);
594 } else if (ent_mpz_unitp(r)) {
597 return make_bigq_bz(XBIGZ_DATA(Qent_mpz_one), XBIGZ_DATA(r));
602 ent_rem_BIGZ_T(Lisp_Object l, Lisp_Object r)
604 if (bigz_sign(XBIGZ_DATA(r)) == 0) {
607 bigz_mod(ent_scratch_bigz, XBIGZ_DATA(l), XBIGZ_DATA(r));
608 return make_bigz_bz(ent_scratch_bigz);
611 ent_rem_BIGZ_T_INT_T(Lisp_Object l, Lisp_Object r)
613 EMACS_INT rr = ent_int(r);
617 bigz_set_long(ent_scratch_bigz, rr);
618 bigz_mod(ent_scratch_bigz, XBIGZ_DATA(l), ent_scratch_bigz);
619 return ent_mpz_downgrade_maybe(ent_scratch_bigz);
622 ent_rem_INT_T_BIGZ_T(Lisp_Object l, Lisp_Object r)
624 if (bigz_sign(XBIGZ_DATA(r)) == 0) {
627 bigz_set_long(ent_scratch_bigz, ent_int(l));
628 bigz_mod(ent_scratch_bigz, ent_scratch_bigz, XBIGZ_DATA(r));
629 return ent_mpz_downgrade_maybe(ent_scratch_bigz);
633 ent_pow_BIGZ_T_integer_trivial(Lisp_Object l, Lisp_Object r)
635 if (!bigz_fits_long_p(XBIGZ_DATA(l)))
636 return Qnull_pointer;
638 if (bigz_to_long(XBIGZ_DATA(l)) == 1L) {
640 } else if (bigz_to_long(XBIGZ_DATA(l)) == -1L) {
641 if (!NILP(Fevenp(r)))
645 } else if (ent_mpz_zerop(l)) {
646 /* actually only idiots want to compute 0-powers
647 * think I put a sleep(10) here to pretend that we're
648 * working rilly hard to solve that problem */
649 if (ent_unrel_zerop(r))
652 return Qent_mpz_zero;
654 return Qnull_pointer;
658 ent_pow_INT_T_integer_trivial(Lisp_Object l, Lisp_Object r)
662 } else if (XINT(l) == -1L) {
663 if (!NILP(Fevenp(r)))
667 } else if (XINT(l) == 0L) {
668 /* actually only idiots want to compute 0-powers
669 * think I put a sleep(10) here to pretend that we're
670 * working rilly hard to solve that problem */
671 if (ent_unrel_zerop(r))
676 return Qnull_pointer;
680 ent_pow_integer_integer(Lisp_Object l, Lisp_Object r)
686 if (INTP(l) && (result = ent_pow_INT_T_integer_trivial(l, r)))
688 else if (BIGZP(l) && (result = ent_pow_BIGZ_T_integer_trivial(l, r)))
691 if (NILP(Fnonnegativep(r))) {
692 /* l can't be inverted in Z, we return 0 or the inverse in Q
693 * depending on `common_lisp_slash' */
694 if (!common_lisp_slash)
695 return Qent_mpz_zero;
698 ent_pow_integer_integer(l, ent_unop_neg(r)));
703 } else if (BIGZP(r)) {
704 if (bigz_fits_long_p(XBIGZ_DATA(r)))
705 expo = bigz_to_long(XBIGZ_DATA(r));
707 Fsignal(Qrange_error, list1(r));
709 Fsignal(Qoperation_error, list1(r));
714 bigz_set_long(ent_scratch_bigz, XINT(l));
715 } else if (BIGZP(l)) {
716 bigz_set(ent_scratch_bigz, XBIGZ_DATA(l));
718 Fsignal(Qoperation_error, list1(l));
722 bigz_pow(ent_scratch_bigz, ent_scratch_bigz, expo);
723 return ent_mpz_downgrade_maybe(ent_scratch_bigz);
728 ent_lt_bigz(Lisp_Object l, Lisp_Object r)
730 return (bigz_lt(XBIGZ_DATA(l), XBIGZ_DATA(r)));
733 ent_lt_bigz_int(Lisp_Object l, Lisp_Object r)
735 bigz_set_long(ent_scratch_bigz, ent_int(r));
736 return (bigz_lt(XBIGZ_DATA(l), ent_scratch_bigz));
739 ent_lt_int_bigz(Lisp_Object l, Lisp_Object r)
741 bigz_set_long(ent_scratch_bigz, ent_int(l));
742 return (bigz_lt(ent_scratch_bigz, XBIGZ_DATA(r)));
746 ent_gt_bigz(Lisp_Object l, Lisp_Object r)
748 return (bigz_gt(XBIGZ_DATA(l), XBIGZ_DATA(r)));
751 ent_gt_bigz_int(Lisp_Object l, Lisp_Object r)
753 bigz_set_long(ent_scratch_bigz, ent_int(r));
754 return (bigz_gt(XBIGZ_DATA(l), ent_scratch_bigz));
757 ent_gt_int_bigz(Lisp_Object l, Lisp_Object r)
759 bigz_set_long(ent_scratch_bigz, ent_int(l));
760 return (bigz_gt(ent_scratch_bigz, XBIGZ_DATA(r)));
764 ent_eq_bigz(Lisp_Object l, Lisp_Object r)
766 return (bigz_eql(XBIGZ_DATA(l), XBIGZ_DATA(r)));
769 ent_eq_bigz_int(Lisp_Object l, Lisp_Object r)
771 bigz_set_long(ent_scratch_bigz, ent_int(r));
772 return (bigz_eql(XBIGZ_DATA(l), ent_scratch_bigz));
775 ent_eq_int_bigz(Lisp_Object l, Lisp_Object r)
777 return ent_eq_bigz_int(r, l);
781 ent_ne_bigz(Lisp_Object l, Lisp_Object r)
783 return !ent_eq_bigz(l, r);
786 ent_ne_bigz_int(Lisp_Object l, Lisp_Object r)
788 return !ent_eq_bigz_int(l, r);
791 ent_ne_int_bigz(Lisp_Object l, Lisp_Object r)
793 return ent_ne_bigz_int(r, l);
798 ent_lt_bigzq_float(Lisp_Object l, Lisp_Object r)
800 return ent_binrel_lift_1(ASE_BINARY_REL_LESSP, l, r, NULL);
803 ent_lt_float_bigzq(Lisp_Object l, Lisp_Object r)
805 return ent_binrel_lift_2(ASE_BINARY_REL_LESSP, l, r, NULL);
808 ent_gt_bigzq_float(Lisp_Object l, Lisp_Object r)
810 return ent_binrel_lift_1(ASE_BINARY_REL_GREATERP, l, r, NULL);
813 ent_gt_float_bigzq(Lisp_Object l, Lisp_Object r)
815 return ent_binrel_lift_2(ASE_BINARY_REL_GREATERP, l, r, NULL);
818 ent_eq_bigzq_float(Lisp_Object l, Lisp_Object r)
820 return ent_binrel_lift_1(ASE_BINARY_REL_EQUALP, l, r, NULL);
823 ent_eq_float_bigzq(Lisp_Object l, Lisp_Object r)
825 return ent_binrel_lift_2(ASE_BINARY_REL_EQUALP, l, r, NULL);
828 ent_ne_bigzq_float(Lisp_Object l, Lisp_Object r)
830 return ent_binrel_lift_1(ASE_BINARY_REL_NEQP, l, r, NULL);
833 ent_ne_float_bigzq(Lisp_Object l, Lisp_Object r)
835 return ent_binrel_lift_2(ASE_BINARY_REL_NEQP, l, r, NULL);
841 _ent_lift_INT_T_BIGZ_T(Lisp_Object number, ent_lift_args_t UNUSED(la))
843 return make_bigz(ent_int(number));
847 _ent_lift_BIGZ_T_INT_T(Lisp_Object number, ent_lift_args_t UNUSED(la))
849 return make_int(bigz_to_long(XBIGZ_DATA(number)));
854 _ent_lift_FLOAT_T_BIGZ_T(Lisp_Object number, ent_lift_args_t UNUSED(la))
856 bigz_set_fpfloat(ent_scratch_bigz, XFLOAT_DATA(number));
857 return make_bigz_bz(ent_scratch_bigz);
861 _ent_lift_BIGZ_T_FLOAT_T(Lisp_Object number, ent_lift_args_t UNUSED(la))
863 /* can result in an indef object */
864 return make_float(bigz_to_fpfloat(XBIGZ_DATA(number)));
871 ent_mpq_zerop(Lisp_Object l)
873 return (bigq_sign(XBIGQ_DATA(l)) == 0);
877 ent_mpq_onep(Lisp_Object l)
879 #define num bigq_numerator(XBIGQ_DATA(l))
880 #define den bigq_denominator(XBIGQ_DATA(l))
881 return (bigz_fits_long_p(num) &&
882 bigz_to_long(num) == 1L &&
883 bigz_fits_long_p(den) &&
884 bigz_to_long(den) == 1L);
890 ent_mpq_unitp(Lisp_Object unused)
896 ent_sum_BIGQ_T(Lisp_Object l, Lisp_Object r)
898 bigq_add(ent_scratch_bigq, XBIGQ_DATA(l), XBIGQ_DATA(r));
899 return ent_mpq_downgrade_maybe(ent_scratch_bigq);
902 ent_sum_BIGQ_T_scratch(Lisp_Object l)
904 bigq_add(ent_scratch_bigq, XBIGQ_DATA(l), ent_scratch_bigq);
905 return ent_mpq_downgrade_maybe(ent_scratch_bigq);
908 ent_sum_BIGQ_T_INT_T(Lisp_Object l, Lisp_Object r)
910 bigq_set_long(ent_scratch_bigq, ent_int(r));
911 return ent_sum_BIGQ_T_scratch(l);
914 ent_sum_INT_T_BIGQ_T(Lisp_Object l, Lisp_Object r)
916 bigq_set_long(ent_scratch_bigq, ent_int(l));
917 return ent_sum_BIGQ_T_scratch(r);
920 ent_sum_BIGQ_T_BIGZ_T(Lisp_Object l, Lisp_Object r)
922 bigq_set_bigz(ent_scratch_bigq, XBIGZ_DATA(r));
923 return ent_sum_BIGQ_T_scratch(l);
926 ent_sum_BIGZ_T_BIGQ_T(Lisp_Object l, Lisp_Object r)
928 return ent_sum_BIGQ_T_BIGZ_T(r, l);
932 ent_sum_BIGQ_T_FLOAT_T(Lisp_Object l, Lisp_Object r)
934 return __ent_binop_lift_1(
935 ASE_BINARY_OP_SUM, BIGQ_T, l, FLOAT_T, r, NULL);
938 ent_sum_FLOAT_T_BIGQ_T(Lisp_Object l, Lisp_Object r)
940 return __ent_binop_lift_2(
941 ASE_BINARY_OP_SUM, FLOAT_T, l, BIGQ_T, r, NULL);
946 ent_diff_BIGQ_T(Lisp_Object l, Lisp_Object r)
948 bigq_sub(ent_scratch_bigq, XBIGQ_DATA(l), XBIGQ_DATA(r));
949 return ent_mpq_downgrade_maybe(ent_scratch_bigq);
952 ent_diff_BIGQ_T_INT_T(Lisp_Object l, Lisp_Object r)
954 bigq_set_long(ent_scratch_bigq, ent_int(r));
955 bigq_sub(ent_scratch_bigq, XBIGQ_DATA(l), ent_scratch_bigq);
956 return ent_mpq_downgrade_maybe(ent_scratch_bigq);
959 ent_diff_INT_T_BIGQ_T(Lisp_Object l, Lisp_Object r)
961 bigq_set_long(ent_scratch_bigq, ent_int(l));
962 bigq_sub(ent_scratch_bigq, ent_scratch_bigq, XBIGQ_DATA(r));
963 return ent_mpq_downgrade_maybe(ent_scratch_bigq);
966 ent_diff_BIGQ_T_BIGZ_T(Lisp_Object l, Lisp_Object r)
968 bigq_set_bigz(ent_scratch_bigq, XBIGZ_DATA(r));
969 bigq_sub(ent_scratch_bigq, XBIGQ_DATA(l), ent_scratch_bigq);
970 return ent_mpq_downgrade_maybe(ent_scratch_bigq);
973 ent_diff_BIGZ_T_BIGQ_T(Lisp_Object l, Lisp_Object r)
975 bigq_set_bigz(ent_scratch_bigq, XBIGZ_DATA(l));
976 bigq_sub(ent_scratch_bigq, ent_scratch_bigq, XBIGQ_DATA(r));
977 return ent_mpq_downgrade_maybe(ent_scratch_bigq);
981 ent_diff_BIGQ_T_FLOAT_T(Lisp_Object l, Lisp_Object r)
983 return __ent_binop_lift_1(
984 ASE_BINARY_OP_DIFF, BIGQ_T, l, FLOAT_T, r, NULL);
987 ent_diff_FLOAT_T_BIGQ_T(Lisp_Object l, Lisp_Object r)
989 return __ent_binop_lift_2(
990 ASE_BINARY_OP_SUM, FLOAT_T, l, BIGQ_T, r, NULL);
995 ent_neg_BIGQ_T(Lisp_Object l)
997 bigq_neg(ent_scratch_bigq, XBIGQ_DATA(l));
998 return make_bigq_bq(ent_scratch_bigq);
1002 ent_prod_BIGQ_T(Lisp_Object l, Lisp_Object r)
1004 bigq_mul(ent_scratch_bigq, XBIGQ_DATA(l), XBIGQ_DATA(r));
1005 return ent_mpq_downgrade_maybe(ent_scratch_bigq);
1008 ent_prod_BIGQ_T_INT_T(Lisp_Object l, Lisp_Object r)
1010 bigq_set_long(ent_scratch_bigq, ent_int(r));
1011 bigq_mul(ent_scratch_bigq, XBIGQ_DATA(l), ent_scratch_bigq);
1012 return ent_mpq_downgrade_maybe(ent_scratch_bigq);
1015 ent_prod_INT_T_BIGQ_T(Lisp_Object l, Lisp_Object r)
1017 return ent_prod_BIGQ_T_INT_T(r, l);
1020 ent_prod_BIGQ_T_BIGZ_T(Lisp_Object l, Lisp_Object r)
1022 bigq_set_bigz(ent_scratch_bigq, XBIGZ_DATA(r));
1023 bigq_mul(ent_scratch_bigq, XBIGQ_DATA(l), ent_scratch_bigq);
1024 return ent_mpq_downgrade_maybe(ent_scratch_bigq);
1027 ent_prod_BIGZ_T_BIGQ_T(Lisp_Object l, Lisp_Object r)
1029 return ent_prod_BIGQ_T_BIGZ_T(r, l);
1033 ent_prod_BIGQ_T_FLOAT_T(Lisp_Object l, Lisp_Object r)
1035 return __ent_binop_lift_1(
1036 ASE_BINARY_OP_PROD, BIGQ_T, l, FLOAT_T, r, NULL);
1039 ent_prod_FLOAT_T_BIGQ_T(Lisp_Object l, Lisp_Object r)
1041 return __ent_binop_lift_2(
1042 ASE_BINARY_OP_PROD, FLOAT_T, l, BIGQ_T, r, NULL);
1047 ent_div_BIGQ_T(Lisp_Object l, Lisp_Object r)
1049 if (bigq_sign(XBIGQ_DATA(r)) == 0) {
1050 int lsgn = bigq_sign(XBIGQ_DATA(l));
1052 return make_indef(POS_INFINITY);
1054 return make_indef(NEG_INFINITY);
1056 return make_indef(NOT_A_NUMBER);
1058 bigq_div(ent_scratch_bigq, XBIGQ_DATA(l), XBIGQ_DATA(r));
1059 return ent_mpq_downgrade_maybe(ent_scratch_bigq);
1062 ent_div_BIGQ_T_INT_T(Lisp_Object l, Lisp_Object r)
1064 EMACS_INT rr = ent_int(r);
1066 int lsgn = bigq_sign(XBIGQ_DATA(l));
1068 return make_indef(POS_INFINITY);
1070 return make_indef(NEG_INFINITY);
1072 return make_indef(NOT_A_NUMBER);
1075 bigq_set_long(ent_scratch_bigq, rr);
1076 bigq_div(ent_scratch_bigq, XBIGQ_DATA(l), ent_scratch_bigq);
1077 return ent_mpq_downgrade_maybe(ent_scratch_bigq);
1080 ent_div_INT_T_BIGQ_T(Lisp_Object l, Lisp_Object r)
1082 if (bigq_sign(XBIGQ_DATA(r)) == 0) {
1083 EMACS_INT rl = ent_int(l);
1085 return make_indef(POS_INFINITY);
1087 return make_indef(NEG_INFINITY);
1089 return make_indef(NOT_A_NUMBER);
1092 bigq_set_long(ent_scratch_bigq, ent_int(l));
1093 bigq_div(ent_scratch_bigq, ent_scratch_bigq, XBIGQ_DATA(r));
1094 return ent_mpq_downgrade_maybe(ent_scratch_bigq);
1097 ent_div_BIGQ_T_BIGZ_T(Lisp_Object l, Lisp_Object r)
1099 if (bigz_sign(XBIGZ_DATA(r)) == 0) {
1100 int lsgn = bigq_sign(XBIGQ_DATA(l));
1102 return make_indef(POS_INFINITY);
1104 return make_indef(NEG_INFINITY);
1106 return make_indef(NOT_A_NUMBER);
1109 bigq_set_bigz(ent_scratch_bigq, XBIGZ_DATA(r));
1110 bigq_div(ent_scratch_bigq, XBIGQ_DATA(l), ent_scratch_bigq);
1111 return ent_mpq_downgrade_maybe(ent_scratch_bigq);
1114 ent_div_BIGZ_T_BIGQ_T(Lisp_Object l, Lisp_Object r)
1116 if (bigq_sign(XBIGQ_DATA(r)) == 0) {
1117 int lsgn = bigz_sign(XBIGZ_DATA(l));
1119 return make_indef(POS_INFINITY);
1121 return make_indef(NEG_INFINITY);
1123 return make_indef(NOT_A_NUMBER);
1126 bigq_set_bigz(ent_scratch_bigq, XBIGZ_DATA(l));
1127 bigq_div(ent_scratch_bigq, ent_scratch_bigq, XBIGQ_DATA(r));
1128 return ent_mpq_downgrade_maybe(ent_scratch_bigq);
1132 ent_div_BIGQ_T_FLOAT_T(Lisp_Object l, Lisp_Object r)
1134 return __ent_binop_lift_1(
1135 ASE_BINARY_OP_DIV, BIGQ_T, l, FLOAT_T, r, NULL);
1138 ent_div_FLOAT_T_BIGQ_T(Lisp_Object l, Lisp_Object r)
1140 return __ent_binop_lift_2(
1141 ASE_BINARY_OP_DIV, FLOAT_T, l, BIGQ_T, r, NULL);
1146 ent_quo_INT_T(Lisp_Object l, Lisp_Object r)
1148 if (ent_int(r) == 0) {
1150 return make_indef(POS_INFINITY);
1151 else if (ent_int(l) < 0)
1152 return make_indef(NEG_INFINITY);
1154 return make_indef(NOT_A_NUMBER);
1157 if (ent_int(r) < 0) {
1158 bigq_set_long_ulong(ent_scratch_bigq,
1159 -ent_int(l), (unsigned long)-ent_int(r));
1160 return ent_mpq_downgrade_maybe(ent_scratch_bigq);
1162 bigq_set_long_ulong(ent_scratch_bigq,
1163 ent_int(l), (unsigned long)ent_int(r));
1164 return ent_mpq_downgrade_maybe(ent_scratch_bigq);
1169 ent_inv_BIGQ_T(Lisp_Object r)
1171 if (bigq_sign(XBIGQ_DATA(r)) == 0) {
1172 return make_indef(POS_INFINITY);
1174 bigq_set_long(ent_scratch_bigq, 1L);
1175 bigq_div(ent_scratch_bigq, ent_scratch_bigq, XBIGQ_DATA(r));
1176 return ent_mpq_downgrade_maybe(ent_scratch_bigq);
1180 ent_inv_INT_T(Lisp_Object l)
1182 if (ent_int(l) == 0) {
1183 return make_indef(POS_INFINITY);
1185 return make_bigq(1L, ent_int(l));
1189 ent_rem_BIGQ_T(Lisp_Object unused, Lisp_Object r)
1191 if (bigq_sign(XBIGQ_DATA(r)) == 0) {
1194 /* actually the zero constructor should be called */
1195 return Qent_mpq_zero;
1198 ent_mod_BIGQ_T(Lisp_Object l, Lisp_Object r)
1200 if (bigq_sign(XBIGQ_DATA(r)) == 0) {
1203 bigq_div(ent_scratch_bigq, XBIGQ_DATA(l), XBIGQ_DATA(r));
1204 bigz_div(ent_scratch_bigz,
1205 bigq_numerator(ent_scratch_bigq),
1206 bigq_denominator(ent_scratch_bigq));
1208 bigq_set_bigz(ent_scratch_bigq, ent_scratch_bigz);
1209 bigq_mul(ent_scratch_bigq, ent_scratch_bigq, XBIGQ_DATA(r));
1210 bigq_sub(ent_scratch_bigq, XBIGQ_DATA(l), ent_scratch_bigq);
1211 return ent_mpq_downgrade_maybe(ent_scratch_bigq);
1215 ent_pow_BIGQ_T_integer_trivial(Lisp_Object l, Lisp_Object r)
1217 if (!_ent_mpz_onep(XBIGQ_DENOMINATOR(l)) ||
1218 !bigz_fits_long_p(XBIGQ_NUMERATOR(l)))
1219 return Qnull_pointer;
1221 if (bigz_to_long(XBIGQ_NUMERATOR(l)) == 1L) {
1223 } else if (bigz_to_long(XBIGQ_NUMERATOR(l)) == -1L) {
1224 if (!NILP(Fevenp(r)))
1225 return Qent_mpq_one;
1228 } else if (ent_mpq_zerop(l)) {
1229 /* actually only idiots want to compute 0-powers
1230 * think I put a sleep(10) here to pretend that we're
1231 * working rilly hard to solve that problem */
1232 if (ent_unrel_zerop(r))
1233 return Qent_mpq_one;
1235 return Qent_mpq_zero;
1237 return Qnull_pointer;
1241 ent_pow_BIGQ_T_integer(Lisp_Object l, Lisp_Object r)
1243 Lisp_Object num, den, result;
1246 if ((result = ent_pow_BIGQ_T_integer_trivial(l, r)))
1249 if (NILP(Fnonnegativep(r))) {
1250 return ent_unop_inv(
1251 ent_pow_BIGQ_T_integer(l, ent_unop_neg(r)));
1254 num = ent_binop(ASE_BINARY_OP_POW,
1255 make_bigz_bz(XBIGQ_NUMERATOR(l)), r);
1256 den = ent_binop(ASE_BINARY_OP_POW,
1257 make_bigz_bz(XBIGQ_DENOMINATOR(l)), r);
1259 if (!INTEGERP(num) || !INTEGERP(den)) {
1260 Fsignal(Qdomain_error, list2(num, den));
1264 if (BIGZP(num) && BIGZP(den))
1265 return make_bigq_bz(XBIGZ_DATA(num), XBIGZ_DATA(den));
1266 else if (INTP(num) && INTP(den))
1267 return make_bigq(ent_int(num), ent_int(den));
1269 num = ent_lift(num, BIGZ_T, NULL);
1270 den = ent_lift(den, BIGZ_T, NULL);
1271 return make_bigq_bz(XBIGZ_DATA(num), XBIGZ_DATA(den));
1279 ent_lt_bigq(Lisp_Object l, Lisp_Object r)
1281 return (bigq_lt(XBIGQ_DATA(l), XBIGQ_DATA(r)));
1284 ent_lt_bigq_int(Lisp_Object l, Lisp_Object r)
1286 bigq_set_long(ent_scratch_bigq, ent_int(r));
1287 return (bigq_lt(XBIGQ_DATA(l), ent_scratch_bigq));
1290 ent_lt_int_bigq(Lisp_Object l, Lisp_Object r)
1292 bigq_set_long(ent_scratch_bigq, ent_int(l));
1293 return (bigq_lt(ent_scratch_bigq, XBIGQ_DATA(r)));
1296 ent_lt_bigq_bigz(Lisp_Object l, Lisp_Object r)
1298 bigq_set_bigz(ent_scratch_bigq, XBIGZ_DATA(r));
1299 return (bigq_lt(XBIGQ_DATA(l), ent_scratch_bigq));
1302 ent_lt_bigz_bigq(Lisp_Object l, Lisp_Object r)
1304 bigq_set_bigz(ent_scratch_bigq, XBIGZ_DATA(l));
1305 return (bigq_lt(ent_scratch_bigq, XBIGQ_DATA(r)));
1309 ent_gt_bigq(Lisp_Object l, Lisp_Object r)
1311 return (bigq_gt(XBIGQ_DATA(l), XBIGQ_DATA(r)));
1314 ent_gt_bigq_int(Lisp_Object l, Lisp_Object r)
1316 bigq_set_long(ent_scratch_bigq, ent_int(r));
1317 return (bigq_gt(XBIGQ_DATA(l), ent_scratch_bigq));
1320 ent_gt_int_bigq(Lisp_Object l, Lisp_Object r)
1322 bigq_set_long(ent_scratch_bigq, ent_int(l));
1323 return (bigq_gt(ent_scratch_bigq, XBIGQ_DATA(r)));
1326 ent_gt_bigq_bigz(Lisp_Object l, Lisp_Object r)
1328 bigq_set_bigz(ent_scratch_bigq, XBIGZ_DATA(r));
1329 return (bigq_gt(XBIGQ_DATA(l), ent_scratch_bigq));
1332 ent_gt_bigz_bigq(Lisp_Object l, Lisp_Object r)
1334 bigq_set_bigz(ent_scratch_bigq, XBIGZ_DATA(l));
1335 return (bigq_gt(ent_scratch_bigq, XBIGQ_DATA(r)));
1339 ent_eq_bigq(Lisp_Object l, Lisp_Object r)
1341 return (bigq_eql(XBIGQ_DATA(l), XBIGQ_DATA(r)));
1344 ent_eq_bigq_int(Lisp_Object l, Lisp_Object r)
1346 bigq_set_long(ent_scratch_bigq, ent_int(r));
1347 return (bigq_eql(XBIGQ_DATA(l), ent_scratch_bigq));
1350 ent_eq_int_bigq(Lisp_Object l, Lisp_Object r)
1352 bigq_set_long(ent_scratch_bigq, ent_int(l));
1353 return (bigq_eql(ent_scratch_bigq, XBIGQ_DATA(r)));
1356 ent_eq_bigq_bigz(Lisp_Object l, Lisp_Object r)
1358 bigq_set_bigz(ent_scratch_bigq, XBIGZ_DATA(r));
1359 return (bigq_eql(XBIGQ_DATA(l), ent_scratch_bigq));
1362 ent_eq_bigz_bigq(Lisp_Object l, Lisp_Object r)
1364 bigq_set_bigz(ent_scratch_bigq, XBIGZ_DATA(l));
1365 return (bigq_eql(ent_scratch_bigq, XBIGQ_DATA(r)));
1369 ent_ne_bigq(Lisp_Object l, Lisp_Object r)
1371 return !(bigq_eql(XBIGQ_DATA(l), XBIGQ_DATA(r)));
1374 ent_ne_bigq_int(Lisp_Object l, Lisp_Object r)
1376 bigq_set_long(ent_scratch_bigq, ent_int(r));
1377 return !(bigq_eql(XBIGQ_DATA(l), ent_scratch_bigq));
1380 ent_ne_int_bigq(Lisp_Object l, Lisp_Object r)
1382 bigq_set_long(ent_scratch_bigq, ent_int(l));
1383 return !(bigq_eql(ent_scratch_bigq, XBIGQ_DATA(r)));
1386 ent_ne_bigq_bigz(Lisp_Object l, Lisp_Object r)
1388 bigq_set_bigz(ent_scratch_bigq, XBIGZ_DATA(r));
1389 return !(bigq_eql(XBIGQ_DATA(l), ent_scratch_bigq));
1392 ent_ne_bigz_bigq(Lisp_Object l, Lisp_Object r)
1394 bigq_set_bigz(ent_scratch_bigq, XBIGZ_DATA(l));
1395 return !(bigq_eql(ent_scratch_bigq, XBIGQ_DATA(r)));
1399 static inline Lisp_Object
1400 _ent_lift_INT_T_BIGQ_T(Lisp_Object number, ent_lift_args_t UNUSED(la))
1402 return make_bigq(ent_int(number), 1UL);
1405 static inline Lisp_Object
1406 _ent_lift_BIGQ_T_INT_T(Lisp_Object number, ent_lift_args_t UNUSED(la))
1408 bigz_div(ent_scratch_bigz,
1409 XBIGQ_NUMERATOR(number),
1410 XBIGQ_DENOMINATOR(number));
1411 return make_int(bigz_to_long(ent_scratch_bigz));
1414 static inline Lisp_Object
1415 _ent_lift_BIGZ_T_BIGQ_T(Lisp_Object number, ent_lift_args_t UNUSED(la))
1417 bigz_set_long(ent_scratch_bigz, 1L);
1418 return make_bigq_bz(XBIGZ_DATA(number), ent_scratch_bigz);
1421 static inline Lisp_Object
1422 _ent_lift_BIGQ_T_BIGZ_T(Lisp_Object number, ent_lift_args_t UNUSED(la))
1424 bigz_div(ent_scratch_bigz,
1425 XBIGQ_NUMERATOR(number),
1426 XBIGQ_DENOMINATOR(number));
1427 return make_bigz_bz(ent_scratch_bigz);
1431 static inline Lisp_Object
1432 _ent_lift_FLOAT_T_BIGQ_T(Lisp_Object number, ent_lift_args_t UNUSED(la))
1434 bigq_set_fpfloat(ent_scratch_bigq, XFLOAT_DATA(number));
1435 return make_bigq_bq(ent_scratch_bigq);
1438 static inline Lisp_Object
1439 _ent_lift_BIGQ_T_FLOAT_T(Lisp_Object number, ent_lift_args_t UNUSED(la))
1441 /* can result in an indef object */
1442 return make_float(bigq_to_fpfloat(XBIGQ_DATA(number)));
1449 ent_mpf_zerop(Lisp_Object l)
1451 return (bigf_sign(XBIGF_DATA(l)) == 0);
1455 ent_mpf_onep(Lisp_Object l)
1457 return (bigf_to_fpfloat(XBIGF_DATA(l)) == 1.0f);
1461 ent_mpf_unitp(Lisp_Object unused)
1467 ent_sum_BIGF_T(Lisp_Object l, Lisp_Object r)
1469 bigf_set_prec(ent_scratch_bigf,
1470 max(XBIGF_GET_PREC(l), XBIGF_GET_PREC(r)));
1471 bigf_add(ent_scratch_bigf, XBIGF_DATA(l), XBIGF_DATA(r));
1472 return make_bigf_bf(ent_scratch_bigf);
1475 ent_sum_BIGF_T_INT_T(Lisp_Object l, Lisp_Object r)
1477 bigf_set_prec(ent_scratch_bigf, XBIGF_GET_PREC(l));
1478 bigf_set_long(ent_scratch_bigf, ent_int(r));
1479 bigf_add(ent_scratch_bigf, XBIGF_DATA(l), ent_scratch_bigf);
1480 return make_bigf_bf(ent_scratch_bigf);
1483 ent_sum_INT_T_BIGF_T(Lisp_Object l, Lisp_Object r)
1485 return ent_sum_BIGF_T_INT_T(r, l);
1488 ent_sum_BIGF_T_BIGZ_T(Lisp_Object l, Lisp_Object r)
1490 bigf_set_prec(ent_scratch_bigf, XBIGF_GET_PREC(l));
1491 bigf_set_bigz(ent_scratch_bigf, XBIGZ_DATA(r));
1492 bigf_add(ent_scratch_bigf, XBIGF_DATA(l), ent_scratch_bigf);
1493 return make_bigf_bf(ent_scratch_bigf);
1496 ent_sum_BIGZ_T_BIGF_T(Lisp_Object l, Lisp_Object r)
1498 return ent_sum_BIGF_T_BIGZ_T(r, l);
1501 ent_sum_BIGF_T_BIGQ_T(Lisp_Object l, Lisp_Object r)
1503 bigf_set_prec(ent_scratch_bigf, XBIGF_GET_PREC(l));
1504 bigf_set_bigq(ent_scratch_bigf, XBIGQ_DATA(r));
1505 bigf_add(ent_scratch_bigf, XBIGF_DATA(l), ent_scratch_bigf);
1506 return make_bigf_bf(ent_scratch_bigf);
1509 ent_sum_BIGQ_T_BIGF_T(Lisp_Object l, Lisp_Object r)
1511 return ent_sum_BIGF_T_BIGQ_T(r, l);
1515 ent_sum_BIGF_T_FLOAT_T(Lisp_Object l, Lisp_Object r)
1517 bigf_set_prec(ent_scratch_bigf, XBIGF_GET_PREC(l));
1518 bigf_set_fpfloat(ent_scratch_bigf, XFLOAT_DATA(r));
1519 bigf_add(ent_scratch_bigf, XBIGF_DATA(l), ent_scratch_bigf);
1520 return make_bigf_bf(ent_scratch_bigf);
1523 ent_sum_FLOAT_T_BIGF_T(Lisp_Object l, Lisp_Object r)
1525 return ent_sum_BIGF_T_FLOAT_T(r, l);
1530 ent_diff_BIGF_T(Lisp_Object l, Lisp_Object r)
1532 bigf_set_prec(ent_scratch_bigf,
1533 max(XBIGF_GET_PREC(l), XBIGF_GET_PREC(r)));
1534 bigf_sub(ent_scratch_bigf, XBIGF_DATA(l), XBIGF_DATA(r));
1535 return make_bigf_bf(ent_scratch_bigf);
1538 ent_diff_BIGF_T_INT_T(Lisp_Object l, Lisp_Object r)
1540 bigf_set_prec(ent_scratch_bigf, XBIGF_GET_PREC(l));
1541 bigf_set_long(ent_scratch_bigf, ent_int(r));
1542 bigf_sub(ent_scratch_bigf, XBIGF_DATA(l), ent_scratch_bigf);
1543 return make_bigf_bf(ent_scratch_bigf);
1546 ent_diff_INT_T_BIGF_T(Lisp_Object l, Lisp_Object r)
1548 bigf_set_prec(ent_scratch_bigf, XBIGF_GET_PREC(r));
1549 bigf_set_long(ent_scratch_bigf, ent_int(l));
1550 bigf_sub(ent_scratch_bigf, ent_scratch_bigf, XBIGF_DATA(r));
1551 return make_bigf_bf(ent_scratch_bigf);
1554 ent_diff_BIGF_T_BIGZ_T(Lisp_Object l, Lisp_Object r)
1556 bigf_set_prec(ent_scratch_bigf, XBIGF_GET_PREC(l));
1557 bigf_set_bigz(ent_scratch_bigf, XBIGZ_DATA(r));
1558 bigf_sub(ent_scratch_bigf, XBIGF_DATA(l), ent_scratch_bigf);
1559 return make_bigf_bf(ent_scratch_bigf);
1562 ent_diff_BIGZ_T_BIGF_T(Lisp_Object l, Lisp_Object r)
1564 bigf_set_prec(ent_scratch_bigf, XBIGF_GET_PREC(r));
1565 bigf_set_bigz(ent_scratch_bigf, XBIGZ_DATA(l));
1566 bigf_sub(ent_scratch_bigf, ent_scratch_bigf, XBIGF_DATA(r));
1567 return make_bigf_bf(ent_scratch_bigf);
1570 ent_diff_BIGF_T_BIGQ_T(Lisp_Object l, Lisp_Object r)
1572 bigf_set_prec(ent_scratch_bigf, XBIGF_GET_PREC(l));
1573 bigf_set_bigq(ent_scratch_bigf, XBIGQ_DATA(r));
1574 bigf_sub(ent_scratch_bigf, XBIGF_DATA(l), ent_scratch_bigf);
1575 return make_bigf_bf(ent_scratch_bigf);
1578 ent_diff_BIGQ_T_BIGF_T(Lisp_Object l, Lisp_Object r)
1580 bigf_set_prec(ent_scratch_bigf, XBIGF_GET_PREC(r));
1581 bigf_set_bigq(ent_scratch_bigf, XBIGQ_DATA(l));
1582 bigf_sub(ent_scratch_bigf, ent_scratch_bigf, XBIGF_DATA(r));
1583 return make_bigf_bf(ent_scratch_bigf);
1587 ent_diff_BIGF_T_FLOAT_T(Lisp_Object l, Lisp_Object r)
1589 bigf_set_prec(ent_scratch_bigf, XBIGF_GET_PREC(l));
1590 bigf_set_fpfloat(ent_scratch_bigf, XFLOAT_DATA(r));
1591 bigf_sub(ent_scratch_bigf, XBIGF_DATA(l), ent_scratch_bigf);
1592 return make_bigf_bf(ent_scratch_bigf);
1595 ent_diff_FLOAT_T_BIGF_T(Lisp_Object l, Lisp_Object r)
1597 bigf_set_prec(ent_scratch_bigf, XBIGF_GET_PREC(r));
1598 bigf_set_fpfloat(ent_scratch_bigf, XFLOAT_DATA(l));
1599 bigf_sub(ent_scratch_bigf, ent_scratch_bigf, XBIGF_DATA(r));
1600 return make_bigf_bf(ent_scratch_bigf);
1605 ent_neg_BIGF_T(Lisp_Object l)
1607 bigf_set_prec(ent_scratch_bigf, XBIGF_GET_PREC(l));
1608 bigf_neg(ent_scratch_bigf, XBIGF_DATA(l));
1609 return make_bigf_bf(ent_scratch_bigf);
1613 ent_prod_BIGF_T(Lisp_Object l, Lisp_Object r)
1615 bigf_set_prec(ent_scratch_bigf,
1616 max(XBIGF_GET_PREC(l), XBIGF_GET_PREC(r)));
1617 bigf_mul(ent_scratch_bigf, XBIGF_DATA(l), XBIGF_DATA(r));
1618 return make_bigf_bf(ent_scratch_bigf);
1621 ent_prod_BIGF_T_INT_T(Lisp_Object l, Lisp_Object r)
1623 bigf_set_prec(ent_scratch_bigf, XBIGF_GET_PREC(l));
1624 bigf_set_long(ent_scratch_bigf, ent_int(r));
1625 bigf_mul(ent_scratch_bigf, XBIGF_DATA(l), ent_scratch_bigf);
1626 return make_bigf_bf(ent_scratch_bigf);
1629 ent_prod_INT_T_BIGF_T(Lisp_Object l, Lisp_Object r)
1631 return ent_prod_BIGF_T_INT_T(r, l);
1634 ent_prod_BIGF_T_BIGZ_T(Lisp_Object l, Lisp_Object r)
1636 bigf_set_prec(ent_scratch_bigf, XBIGF_GET_PREC(l));
1637 bigf_set_bigz(ent_scratch_bigf, XBIGZ_DATA(r));
1638 bigf_mul(ent_scratch_bigf, XBIGF_DATA(l), ent_scratch_bigf);
1639 return make_bigf_bf(ent_scratch_bigf);
1642 ent_prod_BIGZ_T_BIGF_T(Lisp_Object l, Lisp_Object r)
1644 return ent_prod_BIGF_T_BIGZ_T(r, l);
1647 ent_prod_BIGF_T_BIGQ_T(Lisp_Object l, Lisp_Object r)
1649 bigf_set_prec(ent_scratch_bigf, XBIGF_GET_PREC(l));
1650 bigf_set_bigq(ent_scratch_bigf, XBIGQ_DATA(r));
1651 bigf_mul(ent_scratch_bigf, XBIGF_DATA(l), ent_scratch_bigf);
1652 return make_bigf_bf(ent_scratch_bigf);
1655 ent_prod_BIGQ_T_BIGF_T(Lisp_Object l, Lisp_Object r)
1657 return ent_prod_BIGF_T_BIGQ_T(r, l);
1661 ent_prod_BIGF_T_FLOAT_T(Lisp_Object l, Lisp_Object r)
1663 bigf_set_prec(ent_scratch_bigf, XBIGF_GET_PREC(l));
1664 bigf_set_fpfloat(ent_scratch_bigf, XFLOAT_DATA(r));
1665 bigf_mul(ent_scratch_bigf, XBIGF_DATA(l), ent_scratch_bigf);
1666 return make_bigf_bf(ent_scratch_bigf);
1669 ent_prod_FLOAT_T_BIGF_T(Lisp_Object l, Lisp_Object r)
1671 return ent_prod_BIGF_T_FLOAT_T(r, l);
1676 ent_div_BIGF_T(Lisp_Object l, Lisp_Object r)
1678 if (bigf_sign(XBIGF_DATA(r)) == 0) {
1679 int lsgn = bigf_sign(XBIGF_DATA(l));
1681 return make_indef(POS_INFINITY);
1683 return make_indef(NEG_INFINITY);
1685 return make_indef(NOT_A_NUMBER);
1687 bigf_set_prec(ent_scratch_bigf,
1688 max(XBIGF_GET_PREC(l), XBIGF_GET_PREC(r)));
1689 bigf_div(ent_scratch_bigf, XBIGF_DATA(l), XBIGF_DATA(r));
1690 return make_bigf_bf(ent_scratch_bigf);
1693 ent_div_BIGF_T_INT_T(Lisp_Object l, Lisp_Object r)
1695 EMACS_INT rr = ent_int(r);
1697 int lsgn = bigf_sign(XBIGF_DATA(l));
1699 return make_indef(POS_INFINITY);
1701 return make_indef(NEG_INFINITY);
1703 return make_indef(NOT_A_NUMBER);
1706 bigf_set_prec(ent_scratch_bigf, XBIGF_GET_PREC(l));
1707 bigf_set_long(ent_scratch_bigf, rr);
1708 bigf_div(ent_scratch_bigf, XBIGF_DATA(l), ent_scratch_bigf);
1709 return make_bigf_bf(ent_scratch_bigf);
1712 ent_div_INT_T_BIGF_T(Lisp_Object l, Lisp_Object r)
1714 if (bigf_sign(XBIGF_DATA(r)) == 0) {
1715 EMACS_INT rl = ent_int(l);
1717 return make_indef(POS_INFINITY);
1719 return make_indef(NEG_INFINITY);
1721 return make_indef(NOT_A_NUMBER);
1724 bigf_set_prec(ent_scratch_bigf, XBIGF_GET_PREC(r));
1725 bigf_set_long(ent_scratch_bigf, ent_int(l));
1726 bigf_div(ent_scratch_bigf, ent_scratch_bigf, XBIGF_DATA(r));
1727 return make_bigf_bf(ent_scratch_bigf);
1730 ent_div_BIGF_T_BIGZ_T(Lisp_Object l, Lisp_Object r)
1732 if (bigz_sign(XBIGZ_DATA(r)) == 0) {
1733 int lsgn = bigf_sign(XBIGF_DATA(l));
1735 return make_indef(POS_INFINITY);
1737 return make_indef(NEG_INFINITY);
1739 return make_indef(NOT_A_NUMBER);
1742 bigf_set_prec(ent_scratch_bigf, XBIGF_GET_PREC(l));
1743 bigf_set_bigz(ent_scratch_bigf, XBIGZ_DATA(r));
1744 bigf_div(ent_scratch_bigf, XBIGF_DATA(l), ent_scratch_bigf);
1745 return make_bigf_bf(ent_scratch_bigf);
1748 ent_div_BIGZ_T_BIGF_T(Lisp_Object l, Lisp_Object r)
1750 if (bigf_sign(XBIGF_DATA(r)) == 0) {
1751 int lsgn = bigz_sign(XBIGZ_DATA(l));
1753 return make_indef(POS_INFINITY);
1755 return make_indef(NEG_INFINITY);
1757 return make_indef(NOT_A_NUMBER);
1760 bigf_set_prec(ent_scratch_bigf, XBIGF_GET_PREC(r));
1761 bigf_set_bigz(ent_scratch_bigf, XBIGZ_DATA(l));
1762 bigf_div(ent_scratch_bigf, ent_scratch_bigf, XBIGF_DATA(r));
1763 return make_bigf_bf(ent_scratch_bigf);
1766 ent_div_BIGF_T_BIGQ_T(Lisp_Object l, Lisp_Object r)
1768 if (bigq_sign(XBIGQ_DATA(r)) == 0) {
1769 int lsgn = bigf_sign(XBIGF_DATA(l));
1771 return make_indef(POS_INFINITY);
1773 return make_indef(NEG_INFINITY);
1775 return make_indef(NOT_A_NUMBER);
1778 bigf_set_prec(ent_scratch_bigf, XBIGF_GET_PREC(l));
1779 bigf_set_bigq(ent_scratch_bigf, XBIGQ_DATA(r));
1780 bigf_div(ent_scratch_bigf, XBIGF_DATA(l), ent_scratch_bigf);
1781 return make_bigf_bf(ent_scratch_bigf);
1784 ent_div_BIGQ_T_BIGF_T(Lisp_Object l, Lisp_Object r)
1786 if (bigf_sign(XBIGF_DATA(r)) == 0) {
1787 int lsgn = bigq_sign(XBIGQ_DATA(l));
1789 return make_indef(POS_INFINITY);
1791 return make_indef(NEG_INFINITY);
1793 return make_indef(NOT_A_NUMBER);
1796 bigf_set_prec(ent_scratch_bigf, XBIGF_GET_PREC(r));
1797 bigf_set_bigq(ent_scratch_bigf, XBIGQ_DATA(l));
1798 bigf_div(ent_scratch_bigf, ent_scratch_bigf, XBIGF_DATA(r));
1799 return make_bigf_bf(ent_scratch_bigf);
1803 ent_div_BIGF_T_FLOAT_T(Lisp_Object l, Lisp_Object r)
1805 if (XFLOAT_DATA(r) == 0.0f) {
1806 int lsgn = bigf_sign(XBIGF_DATA(l));
1808 return make_indef(POS_INFINITY);
1810 return make_indef(NEG_INFINITY);
1812 return make_indef(NOT_A_NUMBER);
1815 bigf_set_prec(ent_scratch_bigf, XBIGF_GET_PREC(l));
1816 bigf_set_fpfloat(ent_scratch_bigf, XFLOAT_DATA(r));
1817 bigf_div(ent_scratch_bigf, XBIGF_DATA(l), ent_scratch_bigf);
1818 return make_bigf_bf(ent_scratch_bigf);
1821 ent_div_FLOAT_T_BIGF_T(Lisp_Object l, Lisp_Object r)
1823 if (bigf_sign(XBIGF_DATA(r)) == 0) {
1824 if (XFLOAT_DATA(l) > 0.0f)
1825 return make_indef(POS_INFINITY);
1826 else if (XFLOAT_DATA(l) < 0.0f)
1827 return make_indef(NEG_INFINITY);
1829 return make_indef(NOT_A_NUMBER);
1832 bigf_set_prec(ent_scratch_bigf, XBIGF_GET_PREC(r));
1833 bigf_set_fpfloat(ent_scratch_bigf, XFLOAT_DATA(l));
1834 bigf_div(ent_scratch_bigf, ent_scratch_bigf, XBIGF_DATA(r));
1835 return make_bigf_bf(ent_scratch_bigf);
1840 ent_inv_BIGF_T(Lisp_Object r)
1842 if (bigf_sign(XBIGF_DATA(r)) == 0) {
1843 return make_indef(POS_INFINITY);
1845 bigf_set_long(ent_scratch_bigf, 1L);
1846 bigf_set_prec(ent_scratch_bigf, XBIGF_GET_PREC(r));
1847 bigf_div(ent_scratch_bigf, ent_scratch_bigf, XBIGF_DATA(r));
1848 return make_bigf_bf(ent_scratch_bigf);
1852 ent_rem_BIGF_T(Lisp_Object unused, Lisp_Object r)
1854 return Qent_mpf_zero;;
1858 ent_mod_BIGF_T(Lisp_Object l, Lisp_Object r)
1860 if (bigf_sign(XBIGF_DATA(r)) == 0) {
1861 return Qent_mpf_zero;;
1863 bigf_set_prec(ent_scratch_bigf,
1864 max(XBIGF_GET_PREC(l), XBIGF_GET_PREC(r)));
1865 bigf_div(ent_scratch_bigf, XBIGF_DATA(l), XBIGF_DATA(r));
1866 bigf_trunc(ent_scratch_bigf, ent_scratch_bigf);
1867 bigf_mul(ent_scratch_bigf, ent_scratch_bigf, XBIGF_DATA(r));
1868 bigf_sub(ent_scratch_bigf, XBIGF_DATA(l), ent_scratch_bigf);
1869 return make_bigf_bf(ent_scratch_bigf);
1871 #if defined(bigf_pow)
1873 ent_pow_BIGF_T_integer_trivial(Lisp_Object l, Lisp_Object r)
1875 if (bigf_to_fpfloat(XBIGF_DATA(l)) == 1.0f) {
1877 } else if (bigf_to_fpfloat(XBIGF_DATA(l)) == -1.0f) {
1878 if (!NILP(Fevenp(r)))
1879 return Qent_mpf_one;
1882 } else if (ent_mpf_zerop(l)) {
1883 /* actually only idiots want to compute 0-powers
1884 * think I put a sleep(10) here to pretend that we're
1885 * working rilly hard to solve that problem */
1886 if (ent_unrel_zerop(r))
1887 return Qent_mpf_one;
1889 return Qent_mpf_zero;
1891 return Qnull_pointer;
1895 ent_pow_BIGF_T_integer(Lisp_Object l, Lisp_Object r)
1897 unsigned long expo = 0;
1901 if ((result = ent_pow_BIGF_T_integer_trivial(l, r)))
1904 if (NILP(Fnonnegativep(r))) {
1905 return ent_unop_inv(
1906 ent_pow_BIGF_T_integer(l, ent_unop_neg(r)));
1911 } else if (BIGZP(r)) {
1912 if (bigz_fits_ulong_p(XBIGZ_DATA(r)))
1913 expo = bigz_to_ulong(XBIGZ_DATA(r));
1915 Fsignal(Qrange_error, list1(r));
1917 Fsignal(Qoperation_error, list1(r));
1921 bigf_set_prec(ent_scratch_bigf, XBIGF_GET_PREC(l));
1922 bigf_pow(ent_scratch_bigf, XBIGF_DATA(l), expo);
1923 return make_bigf_bf(ent_scratch_bigf);
1929 ent_lt_bigf(Lisp_Object l, Lisp_Object r)
1931 return (bigf_lt(XBIGF_DATA(l), XBIGF_DATA(r)));
1934 ent_lt_bigf_int(Lisp_Object l, Lisp_Object r)
1936 bigf_set_long(ent_scratch_bigf, ent_int(r));
1937 return (bigf_lt(XBIGF_DATA(l), ent_scratch_bigf));
1940 ent_lt_int_bigf(Lisp_Object l, Lisp_Object r)
1942 bigf_set_long(ent_scratch_bigf, ent_int(l));
1943 return (bigf_lt(ent_scratch_bigf, XBIGF_DATA(r)));
1946 ent_lt_bigf_bigz(Lisp_Object l, Lisp_Object r)
1948 bigf_set_bigz(ent_scratch_bigf, XBIGZ_DATA(r));
1949 return (bigf_lt(XBIGF_DATA(l), ent_scratch_bigf));
1952 ent_lt_bigz_bigf(Lisp_Object l, Lisp_Object r)
1954 bigf_set_bigz(ent_scratch_bigf, XBIGZ_DATA(l));
1955 return (bigf_lt(ent_scratch_bigf, XBIGF_DATA(r)));
1958 ent_lt_bigf_bigq(Lisp_Object l, Lisp_Object r)
1960 bigf_set_bigq(ent_scratch_bigf, XBIGQ_DATA(r));
1961 return (bigf_lt(XBIGF_DATA(l), ent_scratch_bigf));
1964 ent_lt_bigq_bigf(Lisp_Object l, Lisp_Object r)
1966 bigf_set_bigq(ent_scratch_bigf, XBIGQ_DATA(l));
1967 return (bigf_lt(ent_scratch_bigf, XBIGF_DATA(r)));
1971 ent_lt_bigf_fpfloat(Lisp_Object l, Lisp_Object r)
1973 bigf_set_fpfloat(ent_scratch_bigf, XFLOAT_DATA(r));
1974 return (bigf_lt(XBIGF_DATA(l), ent_scratch_bigf));
1977 ent_lt_fpfloat_bigf(Lisp_Object l, Lisp_Object r)
1979 bigf_set_fpfloat(ent_scratch_bigf, XFLOAT_DATA(l));
1980 return (bigf_lt(ent_scratch_bigf, XBIGF_DATA(r)));
1985 ent_gt_bigf(Lisp_Object l, Lisp_Object r)
1987 return (bigf_gt(XBIGF_DATA(l), XBIGF_DATA(r)));
1990 ent_gt_bigf_int(Lisp_Object l, Lisp_Object r)
1992 bigf_set_long(ent_scratch_bigf, ent_int(r));
1993 return (bigf_gt(XBIGF_DATA(l), ent_scratch_bigf));
1996 ent_gt_int_bigf(Lisp_Object l, Lisp_Object r)
1998 bigf_set_long(ent_scratch_bigf, ent_int(l));
1999 return (bigf_gt(ent_scratch_bigf, XBIGF_DATA(r)));
2002 ent_gt_bigf_bigz(Lisp_Object l, Lisp_Object r)
2004 bigf_set_bigz(ent_scratch_bigf, XBIGZ_DATA(r));
2005 return (bigf_gt(XBIGF_DATA(l), ent_scratch_bigf));
2008 ent_gt_bigz_bigf(Lisp_Object l, Lisp_Object r)
2010 bigf_set_bigz(ent_scratch_bigf, XBIGZ_DATA(l));
2011 return (bigf_gt(ent_scratch_bigf, XBIGF_DATA(r)));
2014 ent_gt_bigf_bigq(Lisp_Object l, Lisp_Object r)
2016 bigf_set_bigq(ent_scratch_bigf, XBIGQ_DATA(r));
2017 return (bigf_gt(XBIGF_DATA(l), ent_scratch_bigf));
2020 ent_gt_bigq_bigf(Lisp_Object l, Lisp_Object r)
2022 bigf_set_bigq(ent_scratch_bigf, XBIGQ_DATA(l));
2023 return (bigf_gt(ent_scratch_bigf, XBIGF_DATA(r)));
2027 ent_gt_bigf_fpfloat(Lisp_Object l, Lisp_Object r)
2029 bigf_set_fpfloat(ent_scratch_bigf, XFLOAT_DATA(r));
2030 return (bigf_gt(XBIGF_DATA(l), ent_scratch_bigf));
2033 ent_gt_fpfloat_bigf(Lisp_Object l, Lisp_Object r)
2035 bigf_set_fpfloat(ent_scratch_bigf, XFLOAT_DATA(l));
2036 return (bigf_gt(ent_scratch_bigf, XBIGF_DATA(r)));
2041 ent_eq_bigf(Lisp_Object l, Lisp_Object r)
2043 return (bigf_eq(XBIGF_DATA(l), XBIGF_DATA(r)));
2046 ent_eq_bigf_int(Lisp_Object l, Lisp_Object r)
2048 bigf_set_long(ent_scratch_bigf, ent_int(r));
2049 return (bigf_eq(XBIGF_DATA(l), ent_scratch_bigf));
2052 ent_eq_int_bigf(Lisp_Object l, Lisp_Object r)
2054 return ent_eq_bigf_int(r, l);
2057 ent_eq_bigf_bigz(Lisp_Object l, Lisp_Object r)
2059 bigf_set_bigz(ent_scratch_bigf, XBIGZ_DATA(r));
2060 return (bigf_eq(XBIGF_DATA(l), ent_scratch_bigf));
2063 ent_eq_bigz_bigf(Lisp_Object l, Lisp_Object r)
2065 return ent_eq_bigf_bigz(r, l);
2068 ent_eq_bigf_bigq(Lisp_Object l, Lisp_Object r)
2070 bigf_set_bigq(ent_scratch_bigf, XBIGQ_DATA(r));
2071 return (bigf_eq(XBIGF_DATA(l), ent_scratch_bigf));
2074 ent_eq_bigq_bigf(Lisp_Object l, Lisp_Object r)
2076 return ent_eq_bigf_bigq(r, l);
2080 ent_eq_bigf_fpfloat(Lisp_Object l, Lisp_Object r)
2082 bigf_set_fpfloat(ent_scratch_bigf, XFLOAT_DATA(r));
2083 return (bigf_eq(XBIGF_DATA(l), ent_scratch_bigf));
2086 ent_eq_fpfloat_bigf(Lisp_Object l, Lisp_Object r)
2088 bigf_set_fpfloat(ent_scratch_bigf, XFLOAT_DATA(l));
2089 return (bigf_eq(ent_scratch_bigf, XBIGF_DATA(r)));
2094 ent_ne_bigf(Lisp_Object l, Lisp_Object r)
2096 return !(bigf_eq(XBIGF_DATA(l), XBIGF_DATA(r)));
2099 ent_ne_bigf_int(Lisp_Object l, Lisp_Object r)
2101 bigf_set_long(ent_scratch_bigf, ent_int(r));
2102 return !(bigf_eq(XBIGF_DATA(l), ent_scratch_bigf));
2105 ent_ne_int_bigf(Lisp_Object l, Lisp_Object r)
2107 return ent_ne_bigf_int(r, l);
2110 ent_ne_bigf_bigz(Lisp_Object l, Lisp_Object r)
2112 bigf_set_bigz(ent_scratch_bigf, XBIGZ_DATA(r));
2113 return !(bigf_eq(XBIGF_DATA(l), ent_scratch_bigf));
2116 ent_ne_bigz_bigf(Lisp_Object l, Lisp_Object r)
2118 return ent_ne_bigf_bigz(r, l);
2121 ent_ne_bigf_bigq(Lisp_Object l, Lisp_Object r)
2123 bigf_set_bigq(ent_scratch_bigf, XBIGQ_DATA(r));
2124 return !(bigf_eq(XBIGF_DATA(l), ent_scratch_bigf));
2127 ent_ne_bigq_bigf(Lisp_Object l, Lisp_Object r)
2129 return ent_ne_bigf_bigq(r, l);
2133 ent_ne_bigf_fpfloat(Lisp_Object l, Lisp_Object r)
2135 bigf_set_fpfloat(ent_scratch_bigf, XFLOAT_DATA(r));
2136 return !(bigf_eq(XBIGF_DATA(l), ent_scratch_bigf));
2139 ent_ne_fpfloat_bigf(Lisp_Object l, Lisp_Object r)
2141 bigf_set_fpfloat(ent_scratch_bigf, XFLOAT_DATA(l));
2142 return !(bigf_eq(ent_scratch_bigf, XBIGF_DATA(r)));
2148 ent_lift_INT_T_BIGF_T(Lisp_Object number, ent_lift_args_t la)
2150 unsigned long precision = la->precision;
2152 return make_bigf(ent_int(number), precision);
2156 ent_lift_BIGF_T_INT_T(Lisp_Object number, ent_lift_args_t UNUSED(la))
2158 return make_int(bigf_to_long(XBIGF_DATA(number)));
2162 ent_lift_BIGZ_T_BIGF_T(Lisp_Object number, ent_lift_args_t la)
2164 unsigned long precision = la->precision;
2166 bigf_set_prec(ent_scratch_bigf, precision);
2167 bigf_set_bigz(ent_scratch_bigf, XBIGZ_DATA(number));
2168 return make_bigf_bf(ent_scratch_bigf);
2172 ent_lift_BIGF_T_BIGZ_T(Lisp_Object number, ent_lift_args_t UNUSED(la))
2174 bigz_set_bigf(ent_scratch_bigz, XBIGF_DATA(number));
2175 return make_bigz_bz(ent_scratch_bigz);
2179 ent_lift_BIGQ_T_BIGF_T(Lisp_Object number, ent_lift_args_t la)
2181 unsigned long precision = la->precision;
2183 bigf_set_prec(ent_scratch_bigf, precision);
2184 bigf_set_bigq(ent_scratch_bigf, XBIGQ_DATA(number));
2185 return make_bigf_bf(ent_scratch_bigf);
2189 ent_lift_BIGF_T_BIGQ_T(Lisp_Object number, ent_lift_args_t UNUSED(la))
2191 bigq_set_bigf(ent_scratch_bigq, XBIGF_DATA(number));
2192 return make_bigq_bq(ent_scratch_bigq);
2197 ent_lift_FLOAT_T_BIGF_T(Lisp_Object number, ent_lift_args_t la)
2199 unsigned long precision = la->precision;
2201 bigf_set_prec(ent_scratch_bigf, precision);
2202 bigf_set_fpfloat(ent_scratch_bigf, XFLOAT_DATA(number));
2203 return make_bigf_bf(ent_scratch_bigf);
2207 ent_lift_BIGF_T_FLOAT_T(Lisp_Object number, ent_lift_args_t UNUSED(la))
2209 /* can result in an indef object */
2210 return make_float(bigf_to_fpfloat(XBIGF_DATA(number)));
2215 ent_lift_BIGF_T_BIGF_T(Lisp_Object number, ent_lift_args_t la)
2217 unsigned long precision = la->precision;
2219 bigf_set_prec(ent_scratch_bigf, precision);
2220 bigf_set(ent_scratch_bigf, XBIGF_DATA(number));
2221 return make_bigf_bf(ent_scratch_bigf);
2226 ent_mpz_nullary_optable_init(void)
2228 Qent_mpz_zero = make_bigz(0L);
2229 Qent_mpz_one = make_bigz(1L);
2230 staticpro(&Qent_mpz_zero);
2231 staticpro(&Qent_mpz_one);
2233 ent_nullop_register(ASE_NULLARY_OP_ZERO, BIGZ_T, Qent_mpz_zero);
2234 ent_nullop_register(ASE_NULLARY_OP_ONE, BIGZ_T, Qent_mpz_one);
2238 ent_mpz_unary_optable_init(void)
2240 ent_unop_register(ASE_UNARY_OP_NEG, BIGZ_T, ent_neg_BIGZ_T);
2241 ent_unop_register(ASE_UNARY_OP_INV, BIGZ_T, ent_inv_BIGZ_T);
2245 ent_mpz_binary_optable_init(void)
2247 ent_binop_register(ASE_BINARY_OP_SUM,
2248 BIGZ_T, BIGZ_T, ent_sum_BIGZ_T);
2249 ent_binop_register(ASE_BINARY_OP_SUM,
2250 BIGZ_T, INT_T, ent_sum_BIGZ_T_INT_T);
2251 ent_binop_register(ASE_BINARY_OP_SUM,
2252 INT_T, BIGZ_T, ent_sum_INT_T_BIGZ_T);
2254 ent_binop_register(ASE_BINARY_OP_SUM,
2255 FLOAT_T, BIGZ_T, ent_sum_FLOAT_T_BIGZ_T);
2256 ent_binop_register(ASE_BINARY_OP_SUM,
2257 BIGZ_T, FLOAT_T, ent_sum_BIGZ_T_FLOAT_T);
2260 ent_binop_register(ASE_BINARY_OP_DIFF,
2261 BIGZ_T, BIGZ_T, ent_diff_BIGZ_T);
2262 ent_binop_register(ASE_BINARY_OP_DIFF,
2263 BIGZ_T, INT_T, ent_diff_BIGZ_T_INT_T);
2264 ent_binop_register(ASE_BINARY_OP_DIFF,
2265 INT_T, BIGZ_T, ent_diff_INT_T_BIGZ_T);
2267 ent_binop_register(ASE_BINARY_OP_DIFF,
2268 FLOAT_T, BIGZ_T, ent_diff_FLOAT_T_BIGZ_T);
2269 ent_binop_register(ASE_BINARY_OP_DIFF,
2270 BIGZ_T, FLOAT_T, ent_diff_BIGZ_T_FLOAT_T);
2273 ent_binop_register(ASE_BINARY_OP_PROD,
2274 BIGZ_T, BIGZ_T, ent_prod_BIGZ_T);
2275 ent_binop_register(ASE_BINARY_OP_PROD,
2276 BIGZ_T, INT_T, ent_prod_BIGZ_T_INT_T);
2277 ent_binop_register(ASE_BINARY_OP_PROD,
2278 INT_T, BIGZ_T, ent_prod_INT_T_BIGZ_T);
2280 ent_binop_register(ASE_BINARY_OP_PROD,
2281 FLOAT_T, BIGZ_T, ent_prod_FLOAT_T_BIGZ_T);
2282 ent_binop_register(ASE_BINARY_OP_PROD,
2283 BIGZ_T, FLOAT_T, ent_prod_BIGZ_T_FLOAT_T);
2286 ent_binop_register(ASE_BINARY_OP_DIV,
2287 BIGZ_T, BIGZ_T, ent_div_BIGZ_T);
2288 ent_binop_register(ASE_BINARY_OP_DIV,
2289 BIGZ_T, INT_T, ent_div_BIGZ_T_INT_T);
2290 ent_binop_register(ASE_BINARY_OP_DIV,
2291 INT_T, BIGZ_T, ent_div_INT_T_BIGZ_T);
2293 ent_binop_register(ASE_BINARY_OP_DIV,
2294 FLOAT_T, BIGZ_T, ent_div_FLOAT_T_BIGZ_T);
2295 ent_binop_register(ASE_BINARY_OP_DIV,
2296 BIGZ_T, FLOAT_T, ent_div_BIGZ_T_FLOAT_T);
2299 ent_binop_register(ASE_BINARY_OP_QUO,
2300 BIGZ_T, BIGZ_T, ent_quo_BIGZ_T);
2301 ent_binop_register(ASE_BINARY_OP_QUO,
2302 BIGZ_T, INT_T, ent_quo_BIGZ_T_INT_T);
2303 ent_binop_register(ASE_BINARY_OP_QUO,
2304 INT_T, BIGZ_T, ent_quo_INT_T_BIGZ_T);
2306 ent_binop_register(ASE_BINARY_OP_QUO,
2307 FLOAT_T, BIGZ_T, ent_div_FLOAT_T_BIGZ_T);
2308 ent_binop_register(ASE_BINARY_OP_QUO,
2309 BIGZ_T, FLOAT_T, ent_div_BIGZ_T_FLOAT_T);
2313 ent_binop_register(ASE_BINARY_OP_REM,
2314 BIGZ_T, BIGZ_T, ent_rem_BIGZ_T);
2315 ent_binop_register(ASE_BINARY_OP_REM,
2316 BIGZ_T, INT_T, ent_rem_BIGZ_T_INT_T);
2317 ent_binop_register(ASE_BINARY_OP_REM,
2318 INT_T, BIGZ_T, ent_rem_INT_T_BIGZ_T);
2319 ent_binop_register(ASE_BINARY_OP_MOD,
2320 BIGZ_T, BIGZ_T, ent_rem_BIGZ_T);
2321 ent_binop_register(ASE_BINARY_OP_MOD,
2322 BIGZ_T, INT_T, ent_rem_BIGZ_T_INT_T);
2323 ent_binop_register(ASE_BINARY_OP_MOD,
2324 INT_T, BIGZ_T, ent_rem_INT_T_BIGZ_T);
2327 ent_binop_register(ASE_BINARY_OP_POW,
2328 INT_T, INT_T, ent_pow_integer_integer);
2329 ent_binop_register(ASE_BINARY_OP_POW,
2330 INT_T, BIGZ_T, ent_pow_integer_integer);
2331 ent_binop_register(ASE_BINARY_OP_POW,
2332 BIGZ_T, INT_T, ent_pow_integer_integer);
2333 ent_binop_register(ASE_BINARY_OP_POW,
2334 BIGZ_T, BIGZ_T, ent_pow_integer_integer);
2338 ent_mpz_unary_reltable_init(void)
2340 ent_unrel_register(ASE_UNARY_REL_ZEROP, BIGZ_T, ent_mpz_zerop);
2341 ent_unrel_register(ASE_UNARY_REL_ONEP, BIGZ_T, ent_mpz_onep);
2342 ent_unrel_register(ASE_UNARY_REL_UNITP, BIGZ_T, ent_mpz_unitp);
2346 ent_mpz_binary_reltable_init(void)
2348 ent_binrel_register(ASE_BINARY_REL_LESSP,
2349 BIGZ_T, BIGZ_T, ent_lt_bigz);
2350 ent_binrel_register(ASE_BINARY_REL_GREATERP,
2351 BIGZ_T, BIGZ_T, ent_gt_bigz);
2352 ent_binrel_register(ASE_BINARY_REL_EQUALP,
2353 BIGZ_T, BIGZ_T, ent_eq_bigz);
2354 ent_binrel_register(ASE_BINARY_REL_NEQP,
2355 BIGZ_T, BIGZ_T, ent_ne_bigz);
2357 ent_binrel_register(ASE_BINARY_REL_LESSP,
2358 BIGZ_T, INT_T, ent_lt_bigz_int);
2359 ent_binrel_register(ASE_BINARY_REL_GREATERP,
2360 BIGZ_T, INT_T, ent_gt_bigz_int);
2361 ent_binrel_register(ASE_BINARY_REL_EQUALP,
2362 BIGZ_T, INT_T, ent_eq_bigz_int);
2363 ent_binrel_register(ASE_BINARY_REL_NEQP,
2364 BIGZ_T, INT_T, ent_ne_bigz_int);
2366 ent_binrel_register(ASE_BINARY_REL_LESSP,
2367 INT_T, BIGZ_T, ent_lt_int_bigz);
2368 ent_binrel_register(ASE_BINARY_REL_GREATERP,
2369 INT_T, BIGZ_T, ent_gt_int_bigz);
2370 ent_binrel_register(ASE_BINARY_REL_EQUALP,
2371 INT_T, BIGZ_T, ent_eq_int_bigz);
2372 ent_binrel_register(ASE_BINARY_REL_NEQP,
2373 INT_T, BIGZ_T, ent_ne_int_bigz);
2376 ent_binrel_register(ASE_BINARY_REL_LESSP,
2377 BIGZ_T, FLOAT_T, ent_lt_bigzq_float);
2378 ent_binrel_register(ASE_BINARY_REL_GREATERP,
2379 BIGZ_T, FLOAT_T, ent_gt_bigzq_float);
2380 ent_binrel_register(ASE_BINARY_REL_EQUALP,
2381 BIGZ_T, FLOAT_T, ent_eq_bigzq_float);
2382 ent_binrel_register(ASE_BINARY_REL_NEQP,
2383 BIGZ_T, FLOAT_T, ent_ne_bigzq_float);
2385 ent_binrel_register(ASE_BINARY_REL_LESSP,
2386 FLOAT_T, BIGZ_T, ent_lt_float_bigzq);
2387 ent_binrel_register(ASE_BINARY_REL_GREATERP,
2388 FLOAT_T, BIGZ_T, ent_gt_float_bigzq);
2389 ent_binrel_register(ASE_BINARY_REL_EQUALP,
2390 FLOAT_T, BIGZ_T, ent_eq_float_bigzq);
2391 ent_binrel_register(ASE_BINARY_REL_NEQP,
2392 FLOAT_T, BIGZ_T, ent_ne_float_bigzq);
2397 ent_mpz_lifttable_init(void)
2399 ent_lift_register(BIGZ_T, INT_T, _ent_lift_BIGZ_T_INT_T);
2400 ent_lift_register(INT_T, BIGZ_T, _ent_lift_INT_T_BIGZ_T);
2402 ent_lift_register(BIGZ_T, FLOAT_T, _ent_lift_BIGZ_T_FLOAT_T);
2403 ent_lift_register(FLOAT_T, BIGZ_T, _ent_lift_FLOAT_T_BIGZ_T);
2405 ent_lift_register(INDEF_T, BIGZ_T, ent_lift_INDEF_T_COMPARABLE);
2408 void init_optables_BIGZ_T (void)
2410 ent_mpz_nullary_optable_init();
2411 ent_mpz_unary_optable_init();
2412 ent_mpz_binary_optable_init();
2413 ent_mpz_unary_reltable_init();
2414 ent_mpz_binary_reltable_init();
2415 ent_mpz_lifttable_init();
2420 ent_mpq_nullary_optable_init(void)
2422 Qent_mpq_zero = make_bigq(0L, 1L);
2423 Qent_mpq_one = make_bigq(1L, 1L);
2424 staticpro(&Qent_mpq_zero);
2425 staticpro(&Qent_mpq_one);
2427 ent_nullop_register(ASE_NULLARY_OP_ZERO, BIGQ_T, Qent_mpq_zero);
2428 ent_nullop_register(ASE_NULLARY_OP_ONE, BIGQ_T, Qent_mpq_one);
2432 ent_mpq_unary_optable_init(void)
2434 ent_unop_register(ASE_UNARY_OP_NEG, BIGQ_T, ent_neg_BIGQ_T);
2435 ent_unop_register(ASE_UNARY_OP_INV, BIGQ_T, ent_inv_BIGQ_T);
2436 ent_unop_register(ASE_UNARY_OP_INV, INT_T, ent_inv_INT_T);
2440 ent_mpq_binary_optable_init(void)
2443 ent_binop_register(ASE_BINARY_OP_SUM,
2444 BIGQ_T, BIGQ_T, ent_sum_BIGQ_T);
2445 ent_binop_register(ASE_BINARY_OP_SUM,
2446 BIGQ_T, INT_T, ent_sum_BIGQ_T_INT_T);
2447 ent_binop_register(ASE_BINARY_OP_SUM,
2448 INT_T, BIGQ_T, ent_sum_INT_T_BIGQ_T);
2449 ent_binop_register(ASE_BINARY_OP_SUM,
2450 BIGQ_T, BIGZ_T, ent_sum_BIGQ_T_BIGZ_T);
2451 ent_binop_register(ASE_BINARY_OP_SUM,
2452 BIGZ_T, BIGQ_T, ent_sum_BIGZ_T_BIGQ_T);
2454 ent_binop_register(ASE_BINARY_OP_SUM,
2455 FLOAT_T, BIGQ_T, ent_sum_FLOAT_T_BIGQ_T);
2456 ent_binop_register(ASE_BINARY_OP_SUM,
2457 BIGQ_T, FLOAT_T, ent_sum_BIGQ_T_FLOAT_T);
2460 ent_binop_register(ASE_BINARY_OP_DIFF,
2461 BIGQ_T, BIGQ_T, ent_diff_BIGQ_T);
2462 ent_binop_register(ASE_BINARY_OP_DIFF,
2463 BIGQ_T, INT_T, ent_diff_BIGQ_T_INT_T);
2464 ent_binop_register(ASE_BINARY_OP_DIFF,
2465 INT_T, BIGQ_T, ent_diff_INT_T_BIGQ_T);
2466 ent_binop_register(ASE_BINARY_OP_DIFF,
2467 BIGQ_T, BIGZ_T, ent_diff_BIGQ_T_BIGZ_T);
2468 ent_binop_register(ASE_BINARY_OP_DIFF,
2469 BIGZ_T, BIGQ_T, ent_diff_BIGZ_T_BIGQ_T);
2471 ent_binop_register(ASE_BINARY_OP_DIFF,
2472 FLOAT_T, BIGQ_T, ent_diff_FLOAT_T_BIGQ_T);
2473 ent_binop_register(ASE_BINARY_OP_DIFF,
2474 BIGQ_T, FLOAT_T, ent_diff_BIGQ_T_FLOAT_T);
2478 ent_binop_register(ASE_BINARY_OP_PROD,
2479 BIGQ_T, BIGQ_T, ent_prod_BIGQ_T);
2480 ent_binop_register(ASE_BINARY_OP_PROD,
2481 BIGQ_T, INT_T, ent_prod_BIGQ_T_INT_T);
2482 ent_binop_register(ASE_BINARY_OP_PROD,
2483 INT_T, BIGQ_T, ent_prod_INT_T_BIGQ_T);
2484 ent_binop_register(ASE_BINARY_OP_PROD,
2485 BIGQ_T, BIGZ_T, ent_prod_BIGQ_T_BIGZ_T);
2486 ent_binop_register(ASE_BINARY_OP_PROD,
2487 BIGZ_T, BIGQ_T, ent_prod_BIGZ_T_BIGQ_T);
2489 ent_binop_register(ASE_BINARY_OP_PROD,
2490 FLOAT_T, BIGQ_T, ent_prod_FLOAT_T_BIGQ_T);
2491 ent_binop_register(ASE_BINARY_OP_PROD,
2492 BIGQ_T, FLOAT_T, ent_prod_BIGQ_T_FLOAT_T);
2495 ent_binop_register(ASE_BINARY_OP_DIV,
2496 BIGQ_T, BIGQ_T, ent_div_BIGQ_T);
2497 ent_binop_register(ASE_BINARY_OP_DIV,
2498 BIGQ_T, INT_T, ent_div_BIGQ_T_INT_T);
2499 ent_binop_register(ASE_BINARY_OP_DIV,
2500 INT_T, BIGQ_T, ent_div_INT_T_BIGQ_T);
2501 ent_binop_register(ASE_BINARY_OP_DIV,
2502 BIGQ_T, BIGZ_T, ent_div_BIGQ_T_BIGZ_T);
2503 ent_binop_register(ASE_BINARY_OP_DIV,
2504 BIGZ_T, BIGQ_T, ent_div_BIGZ_T_BIGQ_T);
2506 ent_binop_register(ASE_BINARY_OP_DIV,
2507 FLOAT_T, BIGQ_T, ent_div_FLOAT_T_BIGQ_T);
2508 ent_binop_register(ASE_BINARY_OP_DIV,
2509 BIGQ_T, FLOAT_T, ent_div_BIGQ_T_FLOAT_T);
2512 ent_binop_register(ASE_BINARY_OP_QUO,
2513 INT_T, INT_T, ent_quo_INT_T);
2514 ent_binop_register(ASE_BINARY_OP_QUO,
2515 BIGQ_T, BIGQ_T, ent_div_BIGQ_T);
2516 ent_binop_register(ASE_BINARY_OP_QUO,
2517 BIGQ_T, INT_T, ent_div_BIGQ_T_INT_T);
2518 ent_binop_register(ASE_BINARY_OP_QUO,
2519 INT_T, BIGQ_T, ent_div_INT_T_BIGQ_T);
2520 ent_binop_register(ASE_BINARY_OP_QUO,
2521 BIGQ_T, BIGZ_T, ent_div_BIGQ_T_BIGZ_T);
2522 ent_binop_register(ASE_BINARY_OP_QUO,
2523 BIGZ_T, BIGQ_T, ent_div_BIGZ_T_BIGQ_T);
2525 ent_binop_register(ASE_BINARY_OP_QUO,
2526 FLOAT_T, BIGQ_T, ent_div_FLOAT_T_BIGQ_T);
2527 ent_binop_register(ASE_BINARY_OP_QUO,
2528 BIGQ_T, FLOAT_T, ent_div_BIGQ_T_FLOAT_T);
2532 ent_binop_register(ASE_BINARY_OP_REM,
2533 BIGQ_T, BIGQ_T, ent_rem_BIGQ_T);
2534 ent_binop_register(ASE_BINARY_OP_MOD,
2535 BIGQ_T, BIGQ_T, ent_mod_BIGQ_T);
2536 ent_binop_register(ASE_BINARY_OP_POW,
2537 BIGQ_T, INT_T, ent_pow_BIGQ_T_integer);
2538 ent_binop_register(ASE_BINARY_OP_POW,
2539 BIGQ_T, BIGZ_T, ent_pow_BIGQ_T_integer);
2543 ent_mpq_unary_reltable_init(void)
2545 ent_unrel_register(ASE_UNARY_REL_ZEROP, BIGQ_T, ent_mpq_zerop);
2546 ent_unrel_register(ASE_UNARY_REL_ONEP, BIGQ_T, ent_mpq_onep);
2547 ent_unrel_register(ASE_UNARY_REL_UNITP, BIGQ_T, ent_mpq_unitp);
2551 ent_mpq_binary_reltable_init(void)
2553 ent_binrel_register(ASE_BINARY_REL_LESSP,
2554 BIGQ_T, BIGQ_T, ent_lt_bigq);
2555 ent_binrel_register(ASE_BINARY_REL_GREATERP,
2556 BIGQ_T, BIGQ_T, ent_gt_bigq);
2557 ent_binrel_register(ASE_BINARY_REL_EQUALP,
2558 BIGQ_T, BIGQ_T, ent_eq_bigq);
2559 ent_binrel_register(ASE_BINARY_REL_NEQP,
2560 BIGQ_T, BIGQ_T, ent_ne_bigq);
2562 ent_binrel_register(ASE_BINARY_REL_LESSP,
2563 BIGQ_T, INT_T, ent_lt_bigq_int);
2564 ent_binrel_register(ASE_BINARY_REL_GREATERP,
2565 BIGQ_T, INT_T, ent_gt_bigq_int);
2566 ent_binrel_register(ASE_BINARY_REL_EQUALP,
2567 BIGQ_T, INT_T, ent_eq_bigq_int);
2568 ent_binrel_register(ASE_BINARY_REL_NEQP,
2569 BIGQ_T, INT_T, ent_ne_bigq_int);
2571 ent_binrel_register(ASE_BINARY_REL_LESSP,
2572 INT_T, BIGQ_T, ent_lt_int_bigq);
2573 ent_binrel_register(ASE_BINARY_REL_GREATERP,
2574 INT_T, BIGQ_T, ent_gt_int_bigq);
2575 ent_binrel_register(ASE_BINARY_REL_EQUALP,
2576 INT_T, BIGQ_T, ent_eq_int_bigq);
2577 ent_binrel_register(ASE_BINARY_REL_NEQP,
2578 INT_T, BIGQ_T, ent_ne_int_bigq);
2580 ent_binrel_register(ASE_BINARY_REL_LESSP,
2581 BIGQ_T, BIGZ_T, ent_lt_bigq_bigz);
2582 ent_binrel_register(ASE_BINARY_REL_GREATERP,
2583 BIGQ_T, BIGZ_T, ent_gt_bigq_bigz);
2584 ent_binrel_register(ASE_BINARY_REL_EQUALP,
2585 BIGQ_T, BIGZ_T, ent_eq_bigq_bigz);
2586 ent_binrel_register(ASE_BINARY_REL_NEQP,
2587 BIGQ_T, BIGZ_T, ent_ne_bigq_bigz);
2589 ent_binrel_register(ASE_BINARY_REL_LESSP,
2590 BIGZ_T, BIGQ_T, ent_lt_bigz_bigq);
2591 ent_binrel_register(ASE_BINARY_REL_GREATERP,
2592 BIGZ_T, BIGQ_T, ent_gt_bigz_bigq);
2593 ent_binrel_register(ASE_BINARY_REL_EQUALP,
2594 BIGZ_T, BIGQ_T, ent_eq_bigz_bigq);
2595 ent_binrel_register(ASE_BINARY_REL_NEQP,
2596 BIGZ_T, BIGQ_T, ent_ne_bigz_bigq);
2599 ent_binrel_register(ASE_BINARY_REL_LESSP,
2600 BIGQ_T, FLOAT_T, ent_lt_bigzq_float);
2601 ent_binrel_register(ASE_BINARY_REL_GREATERP,
2602 BIGQ_T, FLOAT_T, ent_gt_bigzq_float);
2603 ent_binrel_register(ASE_BINARY_REL_EQUALP,
2604 BIGQ_T, FLOAT_T, ent_eq_bigzq_float);
2605 ent_binrel_register(ASE_BINARY_REL_NEQP,
2606 BIGQ_T, FLOAT_T, ent_ne_bigzq_float);
2608 ent_binrel_register(ASE_BINARY_REL_LESSP,
2609 FLOAT_T, BIGQ_T, ent_lt_float_bigzq);
2610 ent_binrel_register(ASE_BINARY_REL_GREATERP,
2611 FLOAT_T, BIGQ_T, ent_gt_float_bigzq);
2612 ent_binrel_register(ASE_BINARY_REL_EQUALP,
2613 FLOAT_T, BIGQ_T, ent_eq_float_bigzq);
2614 ent_binrel_register(ASE_BINARY_REL_NEQP,
2615 FLOAT_T, BIGQ_T, ent_ne_float_bigzq);
2620 ent_mpq_lifttable_init(void)
2622 ent_lift_register(BIGQ_T, INT_T, _ent_lift_BIGQ_T_INT_T);
2623 ent_lift_register(INT_T, BIGQ_T, _ent_lift_INT_T_BIGQ_T);
2624 ent_lift_register(BIGQ_T, BIGZ_T, _ent_lift_BIGQ_T_BIGZ_T);
2625 ent_lift_register(BIGZ_T, BIGQ_T, _ent_lift_BIGZ_T_BIGQ_T);
2627 ent_lift_register(BIGQ_T, FLOAT_T, _ent_lift_BIGQ_T_FLOAT_T);
2628 ent_lift_register(FLOAT_T, BIGQ_T, _ent_lift_FLOAT_T_BIGQ_T);
2630 ent_lift_register(INDEF_T, BIGQ_T, ent_lift_INDEF_T_COMPARABLE);
2633 void init_optables_BIGQ_T (void)
2635 ent_mpq_nullary_optable_init();
2636 ent_mpq_unary_optable_init();
2637 ent_mpq_binary_optable_init();
2638 ent_mpq_unary_reltable_init();
2639 ent_mpq_binary_reltable_init();
2640 ent_mpq_lifttable_init();
2645 ent_mpf_nullary_optable_init(void)
2647 Qent_mpf_zero = make_bigf(0.0f, internal_get_precision(Qnil));
2648 Qent_mpf_one = make_bigf(1.0f, internal_get_precision(Qnil));
2649 staticpro(&Qent_mpf_zero);
2650 staticpro(&Qent_mpf_one);
2652 ent_nullop_register(ASE_NULLARY_OP_ZERO, BIGF_T, Qent_mpf_zero);
2653 ent_nullop_register(ASE_NULLARY_OP_ONE, BIGF_T, Qent_mpf_one);
2657 ent_mpf_unary_optable_init(void)
2659 ent_unop_register(ASE_UNARY_OP_NEG, BIGF_T, ent_neg_BIGF_T);
2660 ent_unop_register(ASE_UNARY_OP_INV, BIGF_T, ent_inv_BIGF_T);
2664 ent_mpf_binary_optable_init(void)
2667 ent_binop_register(ASE_BINARY_OP_SUM,
2668 BIGF_T, BIGF_T, ent_sum_BIGF_T);
2669 ent_binop_register(ASE_BINARY_OP_SUM,
2670 BIGF_T, INT_T, ent_sum_BIGF_T_INT_T);
2671 ent_binop_register(ASE_BINARY_OP_SUM,
2672 INT_T, BIGF_T, ent_sum_INT_T_BIGF_T);
2673 ent_binop_register(ASE_BINARY_OP_SUM,
2674 BIGF_T, BIGZ_T, ent_sum_BIGF_T_BIGZ_T);
2675 ent_binop_register(ASE_BINARY_OP_SUM,
2676 BIGZ_T, BIGF_T, ent_sum_BIGZ_T_BIGF_T);
2677 ent_binop_register(ASE_BINARY_OP_SUM,
2678 BIGF_T, BIGQ_T, ent_sum_BIGF_T_BIGQ_T);
2679 ent_binop_register(ASE_BINARY_OP_SUM,
2680 BIGQ_T, BIGF_T, ent_sum_BIGQ_T_BIGF_T);
2682 ent_binop_register(ASE_BINARY_OP_SUM,
2683 BIGF_T, FLOAT_T, ent_sum_BIGF_T_FLOAT_T);
2684 ent_binop_register(ASE_BINARY_OP_SUM,
2685 FLOAT_T, BIGF_T, ent_sum_FLOAT_T_BIGF_T);
2688 ent_binop_register(ASE_BINARY_OP_DIFF,
2689 BIGF_T, BIGF_T, ent_diff_BIGF_T);
2690 ent_binop_register(ASE_BINARY_OP_DIFF,
2691 BIGF_T, INT_T, ent_diff_BIGF_T_INT_T);
2692 ent_binop_register(ASE_BINARY_OP_DIFF,
2693 INT_T, BIGF_T, ent_diff_INT_T_BIGF_T);
2694 ent_binop_register(ASE_BINARY_OP_DIFF,
2695 BIGF_T, BIGZ_T, ent_diff_BIGF_T_BIGZ_T);
2696 ent_binop_register(ASE_BINARY_OP_DIFF,
2697 BIGZ_T, BIGF_T, ent_diff_BIGZ_T_BIGF_T);
2698 ent_binop_register(ASE_BINARY_OP_DIFF,
2699 BIGF_T, BIGQ_T, ent_diff_BIGF_T_BIGQ_T);
2700 ent_binop_register(ASE_BINARY_OP_DIFF,
2701 BIGQ_T, BIGF_T, ent_diff_BIGQ_T_BIGF_T);
2703 ent_binop_register(ASE_BINARY_OP_DIFF,
2704 BIGF_T, FLOAT_T, ent_diff_BIGF_T_FLOAT_T);
2705 ent_binop_register(ASE_BINARY_OP_DIFF,
2706 FLOAT_T, BIGF_T, ent_diff_FLOAT_T_BIGF_T);
2709 ent_binop_register(ASE_BINARY_OP_PROD,
2710 BIGF_T, BIGF_T, ent_prod_BIGF_T);
2711 ent_binop_register(ASE_BINARY_OP_PROD,
2712 BIGF_T, INT_T, ent_prod_BIGF_T_INT_T);
2713 ent_binop_register(ASE_BINARY_OP_PROD,
2714 INT_T, BIGF_T, ent_prod_INT_T_BIGF_T);
2715 ent_binop_register(ASE_BINARY_OP_PROD,
2716 BIGF_T, BIGZ_T, ent_prod_BIGF_T_BIGZ_T);
2717 ent_binop_register(ASE_BINARY_OP_PROD,
2718 BIGZ_T, BIGF_T, ent_prod_BIGZ_T_BIGF_T);
2719 ent_binop_register(ASE_BINARY_OP_PROD,
2720 BIGF_T, BIGQ_T, ent_prod_BIGF_T_BIGQ_T);
2721 ent_binop_register(ASE_BINARY_OP_PROD,
2722 BIGQ_T, BIGF_T, ent_prod_BIGQ_T_BIGF_T);
2724 ent_binop_register(ASE_BINARY_OP_PROD,
2725 BIGF_T, FLOAT_T, ent_prod_BIGF_T_FLOAT_T);
2726 ent_binop_register(ASE_BINARY_OP_PROD,
2727 FLOAT_T, BIGF_T, ent_prod_FLOAT_T_BIGF_T);
2730 /* divisions and quotients */
2731 ent_binop_register(ASE_BINARY_OP_DIV,
2732 BIGF_T, BIGF_T, ent_div_BIGF_T);
2733 ent_binop_register(ASE_BINARY_OP_DIV,
2734 BIGF_T, INT_T, ent_div_BIGF_T_INT_T);
2735 ent_binop_register(ASE_BINARY_OP_DIV,
2736 INT_T, BIGF_T, ent_div_INT_T_BIGF_T);
2737 ent_binop_register(ASE_BINARY_OP_DIV,
2738 BIGF_T, BIGZ_T, ent_div_BIGF_T_BIGZ_T);
2739 ent_binop_register(ASE_BINARY_OP_DIV,
2740 BIGZ_T, BIGF_T, ent_div_BIGZ_T_BIGF_T);
2741 ent_binop_register(ASE_BINARY_OP_DIV,
2742 BIGF_T, BIGQ_T, ent_div_BIGF_T_BIGQ_T);
2743 ent_binop_register(ASE_BINARY_OP_DIV,
2744 BIGQ_T, BIGF_T, ent_div_BIGQ_T_BIGF_T);
2746 ent_binop_register(ASE_BINARY_OP_DIV,
2747 BIGF_T, FLOAT_T, ent_div_BIGF_T_FLOAT_T);
2748 ent_binop_register(ASE_BINARY_OP_DIV,
2749 FLOAT_T, BIGF_T, ent_div_FLOAT_T_BIGF_T);
2751 ent_binop_register(ASE_BINARY_OP_QUO,
2752 BIGF_T, BIGF_T, ent_div_BIGF_T);
2753 ent_binop_register(ASE_BINARY_OP_QUO,
2754 BIGF_T, INT_T, ent_div_BIGF_T_INT_T);
2755 ent_binop_register(ASE_BINARY_OP_QUO,
2756 INT_T, BIGF_T, ent_div_INT_T_BIGF_T);
2757 ent_binop_register(ASE_BINARY_OP_QUO,
2758 BIGF_T, BIGZ_T, ent_div_BIGF_T_BIGZ_T);
2759 ent_binop_register(ASE_BINARY_OP_QUO,
2760 BIGZ_T, BIGF_T, ent_div_BIGZ_T_BIGF_T);
2761 ent_binop_register(ASE_BINARY_OP_QUO,
2762 BIGF_T, BIGQ_T, ent_div_BIGF_T_BIGQ_T);
2763 ent_binop_register(ASE_BINARY_OP_QUO,
2764 BIGQ_T, BIGF_T, ent_div_BIGQ_T_BIGF_T);
2766 ent_binop_register(ASE_BINARY_OP_QUO,
2767 BIGF_T, FLOAT_T, ent_div_BIGF_T_FLOAT_T);
2768 ent_binop_register(ASE_BINARY_OP_QUO,
2769 FLOAT_T, BIGF_T, ent_div_FLOAT_T_BIGF_T);
2772 ent_binop_register(ASE_BINARY_OP_REM,
2773 BIGF_T, BIGF_T, ent_rem_BIGF_T);
2774 ent_binop_register(ASE_BINARY_OP_MOD,
2775 BIGF_T, BIGF_T, ent_mod_BIGF_T);
2777 ent_binop_register(ASE_BINARY_OP_POW,
2778 BIGF_T, INT_T, ent_pow_BIGF_T_integer);
2779 ent_binop_register(ASE_BINARY_OP_POW,
2780 BIGF_T, BIGZ_T, ent_pow_BIGF_T_integer);
2785 ent_mpf_unary_reltable_init(void)
2787 ent_unrel_register(ASE_UNARY_REL_ZEROP, BIGF_T, ent_mpf_zerop);
2788 ent_unrel_register(ASE_UNARY_REL_ONEP, BIGF_T, ent_mpf_onep);
2789 ent_unrel_register(ASE_UNARY_REL_UNITP, BIGF_T, ent_mpf_unitp);
2793 ent_mpf_binary_reltable_init(void)
2795 ent_binrel_register(ASE_BINARY_REL_LESSP,
2796 BIGF_T, BIGF_T, ent_lt_bigf);
2797 ent_binrel_register(ASE_BINARY_REL_GREATERP,
2798 BIGF_T, BIGF_T, ent_gt_bigf);
2799 ent_binrel_register(ASE_BINARY_REL_EQUALP,
2800 BIGF_T, BIGF_T, ent_eq_bigf);
2801 ent_binrel_register(ASE_BINARY_REL_NEQP,
2802 BIGF_T, BIGF_T, ent_ne_bigf);
2804 ent_binrel_register(ASE_BINARY_REL_LESSP,
2805 BIGF_T, INT_T, ent_lt_bigf_int);
2806 ent_binrel_register(ASE_BINARY_REL_GREATERP,
2807 BIGF_T, INT_T, ent_gt_bigf_int);
2808 ent_binrel_register(ASE_BINARY_REL_EQUALP,
2809 BIGF_T, INT_T, ent_eq_bigf_int);
2810 ent_binrel_register(ASE_BINARY_REL_NEQP,
2811 BIGF_T, INT_T, ent_ne_bigf_int);
2813 ent_binrel_register(ASE_BINARY_REL_LESSP,
2814 INT_T, BIGF_T, ent_lt_int_bigf);
2815 ent_binrel_register(ASE_BINARY_REL_GREATERP,
2816 INT_T, BIGF_T, ent_gt_int_bigf);
2817 ent_binrel_register(ASE_BINARY_REL_EQUALP,
2818 INT_T, BIGF_T, ent_eq_int_bigf);
2819 ent_binrel_register(ASE_BINARY_REL_NEQP,
2820 INT_T, BIGF_T, ent_ne_int_bigf);
2822 ent_binrel_register(ASE_BINARY_REL_LESSP,
2823 BIGF_T, BIGZ_T, ent_lt_bigf_bigz);
2824 ent_binrel_register(ASE_BINARY_REL_GREATERP,
2825 BIGF_T, BIGZ_T, ent_gt_bigf_bigz);
2826 ent_binrel_register(ASE_BINARY_REL_EQUALP,
2827 BIGF_T, BIGZ_T, ent_eq_bigf_bigz);
2828 ent_binrel_register(ASE_BINARY_REL_NEQP,
2829 BIGF_T, BIGZ_T, ent_ne_bigf_bigz);
2831 ent_binrel_register(ASE_BINARY_REL_LESSP,
2832 BIGZ_T, BIGF_T, ent_lt_bigz_bigf);
2833 ent_binrel_register(ASE_BINARY_REL_GREATERP,
2834 BIGZ_T, BIGF_T, ent_gt_bigz_bigf);
2835 ent_binrel_register(ASE_BINARY_REL_EQUALP,
2836 BIGZ_T, BIGF_T, ent_eq_bigz_bigf);
2837 ent_binrel_register(ASE_BINARY_REL_NEQP,
2838 BIGZ_T, BIGF_T, ent_ne_bigz_bigf);
2840 ent_binrel_register(ASE_BINARY_REL_LESSP,
2841 BIGF_T, BIGQ_T, ent_lt_bigf_bigq);
2842 ent_binrel_register(ASE_BINARY_REL_GREATERP,
2843 BIGF_T, BIGQ_T, ent_gt_bigf_bigq);
2844 ent_binrel_register(ASE_BINARY_REL_EQUALP,
2845 BIGF_T, BIGQ_T, ent_eq_bigf_bigq);
2846 ent_binrel_register(ASE_BINARY_REL_NEQP,
2847 BIGF_T, BIGQ_T, ent_ne_bigf_bigq);
2849 ent_binrel_register(ASE_BINARY_REL_LESSP,
2850 BIGQ_T, BIGF_T, ent_lt_bigq_bigf);
2851 ent_binrel_register(ASE_BINARY_REL_GREATERP,
2852 BIGQ_T, BIGF_T, ent_gt_bigq_bigf);
2853 ent_binrel_register(ASE_BINARY_REL_EQUALP,
2854 BIGQ_T, BIGF_T, ent_eq_bigq_bigf);
2855 ent_binrel_register(ASE_BINARY_REL_NEQP,
2856 BIGQ_T, BIGF_T, ent_ne_bigq_bigf);
2859 ent_binrel_register(ASE_BINARY_REL_LESSP,
2860 BIGF_T, FLOAT_T, ent_lt_bigf_fpfloat);
2861 ent_binrel_register(ASE_BINARY_REL_GREATERP,
2862 BIGF_T, FLOAT_T, ent_gt_bigf_fpfloat);
2863 ent_binrel_register(ASE_BINARY_REL_EQUALP,
2864 BIGF_T, FLOAT_T, ent_eq_bigf_fpfloat);
2865 ent_binrel_register(ASE_BINARY_REL_NEQP,
2866 BIGF_T, FLOAT_T, ent_ne_bigf_fpfloat);
2868 ent_binrel_register(ASE_BINARY_REL_LESSP,
2869 FLOAT_T, BIGF_T, ent_lt_fpfloat_bigf);
2870 ent_binrel_register(ASE_BINARY_REL_GREATERP,
2871 FLOAT_T, BIGF_T, ent_gt_fpfloat_bigf);
2872 ent_binrel_register(ASE_BINARY_REL_EQUALP,
2873 FLOAT_T, BIGF_T, ent_eq_fpfloat_bigf);
2874 ent_binrel_register(ASE_BINARY_REL_NEQP,
2875 FLOAT_T, BIGF_T, ent_ne_fpfloat_bigf);
2880 ent_mpf_lifttable_init(void)
2882 ent_lift_register(INT_T, BIGF_T, ent_lift_INT_T_BIGF_T);
2883 ent_lift_register(BIGF_T, INT_T, ent_lift_BIGF_T_INT_T);
2884 ent_lift_register(BIGZ_T, BIGF_T, ent_lift_BIGZ_T_BIGF_T);
2885 ent_lift_register(BIGF_T, BIGZ_T, ent_lift_BIGF_T_BIGZ_T);
2886 ent_lift_register(BIGQ_T, BIGF_T, ent_lift_BIGQ_T_BIGF_T);
2887 ent_lift_register(BIGF_T, BIGQ_T, ent_lift_BIGF_T_BIGQ_T);
2889 ent_lift_register(FLOAT_T, BIGF_T, ent_lift_FLOAT_T_BIGF_T);
2890 ent_lift_register(BIGF_T, FLOAT_T, ent_lift_BIGF_T_FLOAT_T);
2892 ent_lift_register(BIGF_T, BIGF_T, ent_lift_BIGF_T_BIGF_T);
2893 ent_lift_register(INDEF_T, BIGF_T, ent_lift_INDEF_T_COMPARABLE);
2896 void init_optables_BIGF_T (void)
2898 ent_mpf_nullary_optable_init();
2899 ent_mpf_unary_optable_init();
2900 ent_mpf_binary_optable_init();
2901 ent_mpf_unary_reltable_init();
2902 ent_mpf_binary_reltable_init();
2903 ent_mpf_lifttable_init();
2908 /* Prepare the bignum/bigfloat random number generator */
2909 gmp_randinit_default(random_state);
2910 gmp_randseed_ui(random_state, getpid() + time (NULL));
2912 bigz_init(ent_scratch_bigz);
2915 void init_ent_mpq(void)
2917 bigq_init(ent_scratch_bigq);
2922 /* The smallest number that is printed without exponents */
2923 mpf_init_set_d(float_print_min, 0.001);
2925 /* The largest number that is printed without exponents */
2926 mpf_init_set_ui(float_print_max, 10000000UL);
2928 bigf_init(ent_scratch_bigf);
2931 void syms_of_ent_mpz(void)
2933 INIT_LRECORD_IMPLEMENTATION(bigz);
2936 void syms_of_ent_mpq(void)
2938 INIT_LRECORD_IMPLEMENTATION(bigq);
2941 void syms_of_ent_mpf(void)
2943 INIT_LRECORD_IMPLEMENTATION(bigf);
2945 DEFSUBR(Fbigf_get_precision);
2946 DEFSUBR(Fbigf_set_precision);
2949 void vars_of_ent_mpz(void)
2951 Fprovide(intern("bignum")); /* for XE compatibility */
2952 Fprovide(intern("bigz"));
2955 void vars_of_ent_mpq(void)
2957 Fprovide(intern("ratio")); /* for XE compatibility */
2958 Fprovide(intern("bigq"));
2961 void vars_of_ent_mpf(void)
2963 bigf_set_default_prec(128UL);
2965 Fprovide(intern("bigfloat")); /* for XE compatibility */
2966 Fprovide(intern("bigf"));