aboutsummaryrefslogtreecommitdiffstats
path: root/src/data.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/data.c')
-rw-r--r--src/data.c71
1 files changed, 69 insertions, 2 deletions
diff --git a/src/data.c b/src/data.c
index 8ffed8bbb52..97554c7e1d2 100644
--- a/src/data.c
+++ b/src/data.c
@@ -2397,6 +2397,70 @@ bool-vector. IDX starts at 0. */)
2397 2397
2398/* Arithmetic functions */ 2398/* Arithmetic functions */
2399 2399
2400static Lisp_Object
2401bignumcompare (Lisp_Object num1, Lisp_Object num2,
2402 enum Arith_Comparison comparison)
2403{
2404 int cmp;
2405 bool test;
2406
2407 if (BIGNUMP (num1))
2408 {
2409 if (FLOATP (num2))
2410 cmp = mpz_cmp_d (XBIGNUM (num1)->value, XFLOAT_DATA (num2));
2411 else if (FIXNUMP (num2))
2412 cmp = mpz_cmp_si (XBIGNUM (num1)->value, XINT (num2));
2413 else
2414 {
2415 eassume (BIGNUMP (num2));
2416 cmp = mpz_cmp (XBIGNUM (num1)->value, XBIGNUM (num2)->value);
2417 }
2418 }
2419 else
2420 {
2421 eassume (BIGNUMP (num2));
2422 if (FLOATP (num1))
2423 cmp = - mpz_cmp_d (XBIGNUM (num2)->value, XFLOAT_DATA (num1));
2424 else
2425 {
2426 eassume (FIXNUMP (num1));
2427 cmp = - mpz_cmp_si (XBIGNUM (num2)->value, XINT (num1));
2428 }
2429 }
2430
2431 switch (comparison)
2432 {
2433 case ARITH_EQUAL:
2434 test = cmp == 0;
2435 break;
2436
2437 case ARITH_NOTEQUAL:
2438 test = cmp != 0;
2439 break;
2440
2441 case ARITH_LESS:
2442 test = cmp < 0;
2443 break;
2444
2445 case ARITH_LESS_OR_EQUAL:
2446 test = cmp <= 0;
2447 break;
2448
2449 case ARITH_GRTR:
2450 test = cmp > 0;
2451 break;
2452
2453 case ARITH_GRTR_OR_EQUAL:
2454 test = cmp >= 0;
2455 break;
2456
2457 default:
2458 eassume (false);
2459 }
2460
2461 return test ? Qt : Qnil;
2462}
2463
2400Lisp_Object 2464Lisp_Object
2401arithcompare (Lisp_Object num1, Lisp_Object num2, 2465arithcompare (Lisp_Object num1, Lisp_Object num2,
2402 enum Arith_Comparison comparison) 2466 enum Arith_Comparison comparison)
@@ -2406,8 +2470,11 @@ arithcompare (Lisp_Object num1, Lisp_Object num2,
2406 bool fneq; 2470 bool fneq;
2407 bool test; 2471 bool test;
2408 2472
2409 CHECK_FIXNUM_OR_FLOAT_COERCE_MARKER (num1); 2473 CHECK_NUMBER_COERCE_MARKER (num1);
2410 CHECK_FIXNUM_OR_FLOAT_COERCE_MARKER (num2); 2474 CHECK_NUMBER_COERCE_MARKER (num2);
2475
2476 if (BIGNUMP (num1) || BIGNUMP (num2))
2477 return bignumcompare (num1, num2, comparison);
2411 2478
2412 /* If either arg is floating point, set F1 and F2 to the 'double' 2479 /* If either arg is floating point, set F1 and F2 to the 'double'
2413 approximations of the two arguments, and set FNEQ if floating-point 2480 approximations of the two arguments, and set FNEQ if floating-point