diff options
Diffstat (limited to 'src/data.c')
| -rw-r--r-- | src/data.c | 43 |
1 files changed, 29 insertions, 14 deletions
diff --git a/src/data.c b/src/data.c index c8a9c6b3783..7b8dd45c948 100644 --- a/src/data.c +++ b/src/data.c | |||
| @@ -2492,7 +2492,7 @@ arithcompare (Lisp_Object num1, Lisp_Object num2, | |||
| 2492 | { | 2492 | { |
| 2493 | double f1, f2; | 2493 | double f1, f2; |
| 2494 | EMACS_INT i1, i2; | 2494 | EMACS_INT i1, i2; |
| 2495 | bool fneq; | 2495 | bool lt, eq, gt; |
| 2496 | bool test; | 2496 | bool test; |
| 2497 | 2497 | ||
| 2498 | CHECK_NUMBER_COERCE_MARKER (num1); | 2498 | CHECK_NUMBER_COERCE_MARKER (num1); |
| @@ -2502,10 +2502,13 @@ arithcompare (Lisp_Object num1, Lisp_Object num2, | |||
| 2502 | return bignumcompare (num1, num2, comparison); | 2502 | return bignumcompare (num1, num2, comparison); |
| 2503 | 2503 | ||
| 2504 | /* If either arg is floating point, set F1 and F2 to the 'double' | 2504 | /* If either arg is floating point, set F1 and F2 to the 'double' |
| 2505 | approximations of the two arguments, and set FNEQ if floating-point | 2505 | approximations of the two arguments, and set LT, EQ, and GT to |
| 2506 | comparison reports that F1 is not equal to F2, possibly because F1 | 2506 | the <, ==, > floating-point comparisons of F1 and F2 |
| 2507 | or F2 is a NaN. Regardless, set I1 and I2 to integers that break | 2507 | respectively, taking care to avoid problems if either is a NaN, |
| 2508 | ties if the floating-point comparison is either not done or reports | 2508 | and trying to avoid problems on platforms where variables (in |
| 2509 | violation of the C standard) can contain excess precision. | ||
| 2510 | Regardless, set I1 and I2 to integers that break ties if the | ||
| 2511 | floating-point comparison is either not done or reports | ||
| 2509 | equality. */ | 2512 | equality. */ |
| 2510 | 2513 | ||
| 2511 | if (FLOATP (num1)) | 2514 | if (FLOATP (num1)) |
| @@ -2528,7 +2531,9 @@ arithcompare (Lisp_Object num1, Lisp_Object num2, | |||
| 2528 | to I2 will break the tie correctly. */ | 2531 | to I2 will break the tie correctly. */ |
| 2529 | i1 = f2 = i2 = XFIXNUM (num2); | 2532 | i1 = f2 = i2 = XFIXNUM (num2); |
| 2530 | } | 2533 | } |
| 2531 | fneq = f1 != f2; | 2534 | lt = f1 < f2; |
| 2535 | eq = f1 == f2; | ||
| 2536 | gt = f1 > f2; | ||
| 2532 | } | 2537 | } |
| 2533 | else | 2538 | else |
| 2534 | { | 2539 | { |
| @@ -2539,39 +2544,49 @@ arithcompare (Lisp_Object num1, Lisp_Object num2, | |||
| 2539 | converse of comparing float to integer (see above). */ | 2544 | converse of comparing float to integer (see above). */ |
| 2540 | i2 = f1 = i1; | 2545 | i2 = f1 = i1; |
| 2541 | f2 = XFLOAT_DATA (num2); | 2546 | f2 = XFLOAT_DATA (num2); |
| 2542 | fneq = f1 != f2; | 2547 | lt = f1 < f2; |
| 2548 | eq = f1 == f2; | ||
| 2549 | gt = f1 > f2; | ||
| 2543 | } | 2550 | } |
| 2544 | else | 2551 | else |
| 2545 | { | 2552 | { |
| 2546 | i2 = XFIXNUM (num2); | 2553 | i2 = XFIXNUM (num2); |
| 2547 | fneq = false; | 2554 | eq = true; |
| 2548 | } | 2555 | } |
| 2549 | } | 2556 | } |
| 2550 | 2557 | ||
| 2558 | if (eq) | ||
| 2559 | { | ||
| 2560 | /* Break a floating-point tie by comparing the integers. */ | ||
| 2561 | lt = i1 < i2; | ||
| 2562 | eq = i1 == i2; | ||
| 2563 | gt = i1 > i2; | ||
| 2564 | } | ||
| 2565 | |||
| 2551 | switch (comparison) | 2566 | switch (comparison) |
| 2552 | { | 2567 | { |
| 2553 | case ARITH_EQUAL: | 2568 | case ARITH_EQUAL: |
| 2554 | test = !fneq && i1 == i2; | 2569 | test = eq; |
| 2555 | break; | 2570 | break; |
| 2556 | 2571 | ||
| 2557 | case ARITH_NOTEQUAL: | 2572 | case ARITH_NOTEQUAL: |
| 2558 | test = fneq || i1 != i2; | 2573 | test = !eq; |
| 2559 | break; | 2574 | break; |
| 2560 | 2575 | ||
| 2561 | case ARITH_LESS: | 2576 | case ARITH_LESS: |
| 2562 | test = fneq ? f1 < f2 : i1 < i2; | 2577 | test = lt; |
| 2563 | break; | 2578 | break; |
| 2564 | 2579 | ||
| 2565 | case ARITH_LESS_OR_EQUAL: | 2580 | case ARITH_LESS_OR_EQUAL: |
| 2566 | test = fneq ? f1 <= f2 : i1 <= i2; | 2581 | test = lt | eq; |
| 2567 | break; | 2582 | break; |
| 2568 | 2583 | ||
| 2569 | case ARITH_GRTR: | 2584 | case ARITH_GRTR: |
| 2570 | test = fneq ? f1 > f2 : i1 > i2; | 2585 | test = gt; |
| 2571 | break; | 2586 | break; |
| 2572 | 2587 | ||
| 2573 | case ARITH_GRTR_OR_EQUAL: | 2588 | case ARITH_GRTR_OR_EQUAL: |
| 2574 | test = fneq ? f1 >= f2 : i1 >= i2; | 2589 | test = gt | eq; |
| 2575 | break; | 2590 | break; |
| 2576 | 2591 | ||
| 2577 | default: | 2592 | default: |