Mercurial > emacs
comparison src/floatfns.c @ 9129:b2d1d925d5cc
(extract_float, Fexpt, Fabs, Ffloat, Fceiling, Ffloor, Fround, Ftruncate): Use
type test macros.
| author | Karl Heuer <kwzh@gnu.org> |
|---|---|
| date | Tue, 27 Sep 1994 03:01:14 +0000 |
| parents | 5e5f6d06fb5b |
| children | 1b685d477c10 |
comparison
equal
deleted
inserted
replaced
| 9128:04a702d7f662 | 9129:b2d1d925d5cc |
|---|---|
| 215 extract_float (num) | 215 extract_float (num) |
| 216 Lisp_Object num; | 216 Lisp_Object num; |
| 217 { | 217 { |
| 218 CHECK_NUMBER_OR_FLOAT (num, 0); | 218 CHECK_NUMBER_OR_FLOAT (num, 0); |
| 219 | 219 |
| 220 if (XTYPE (num) == Lisp_Float) | 220 if (FLOATP (num)) |
| 221 return XFLOAT (num)->data; | 221 return XFLOAT (num)->data; |
| 222 return (double) XINT (num); | 222 return (double) XINT (num); |
| 223 } | 223 } |
| 224 | 224 |
| 225 /* Trig functions. */ | 225 /* Trig functions. */ |
| 442 { | 442 { |
| 443 double f1, f2; | 443 double f1, f2; |
| 444 | 444 |
| 445 CHECK_NUMBER_OR_FLOAT (arg1, 0); | 445 CHECK_NUMBER_OR_FLOAT (arg1, 0); |
| 446 CHECK_NUMBER_OR_FLOAT (arg2, 0); | 446 CHECK_NUMBER_OR_FLOAT (arg2, 0); |
| 447 if (XTYPE (arg1) == Lisp_Int /* common lisp spec */ | 447 if (INTEGERP (arg1) /* common lisp spec */ |
| 448 && XTYPE (arg2) == Lisp_Int) /* don't promote, if both are ints */ | 448 && INTEGERP (arg2)) /* don't promote, if both are ints */ |
| 449 { /* this can be improved by pre-calculating */ | 449 { /* this can be improved by pre-calculating */ |
| 450 int acc, x, y; /* some binary powers of x then accumulating */ | 450 int acc, x, y; /* some binary powers of x then accumulating */ |
| 451 Lisp_Object val; | 451 Lisp_Object val; |
| 452 | 452 |
| 453 x = XINT (arg1); | 453 x = XINT (arg1); |
| 474 } | 474 } |
| 475 } | 475 } |
| 476 XSET (val, Lisp_Int, acc); | 476 XSET (val, Lisp_Int, acc); |
| 477 return val; | 477 return val; |
| 478 } | 478 } |
| 479 f1 = (XTYPE (arg1) == Lisp_Float) ? XFLOAT (arg1)->data : XINT (arg1); | 479 f1 = FLOATP (arg1) ? XFLOAT (arg1)->data : XINT (arg1); |
| 480 f2 = (XTYPE (arg2) == Lisp_Float) ? XFLOAT (arg2)->data : XINT (arg2); | 480 f2 = FLOATP (arg2) ? XFLOAT (arg2)->data : XINT (arg2); |
| 481 /* Really should check for overflow, too */ | 481 /* Really should check for overflow, too */ |
| 482 if (f1 == 0.0 && f2 == 0.0) | 482 if (f1 == 0.0 && f2 == 0.0) |
| 483 f1 = 1.0; | 483 f1 = 1.0; |
| 484 #ifdef FLOAT_CHECK_DOMAIN | 484 #ifdef FLOAT_CHECK_DOMAIN |
| 485 else if ((f1 == 0.0 && f2 < 0.0) || (f1 < 0 && f2 != floor(f2))) | 485 else if ((f1 == 0.0 && f2 < 0.0) || (f1 < 0 && f2 != floor(f2))) |
| 643 (arg) | 643 (arg) |
| 644 register Lisp_Object arg; | 644 register Lisp_Object arg; |
| 645 { | 645 { |
| 646 CHECK_NUMBER_OR_FLOAT (arg, 0); | 646 CHECK_NUMBER_OR_FLOAT (arg, 0); |
| 647 | 647 |
| 648 if (XTYPE (arg) == Lisp_Float) | 648 if (FLOATP (arg)) |
| 649 IN_FLOAT (arg = make_float (fabs (XFLOAT (arg)->data)), "abs", arg); | 649 IN_FLOAT (arg = make_float (fabs (XFLOAT (arg)->data)), "abs", arg); |
| 650 else if (XINT (arg) < 0) | 650 else if (XINT (arg) < 0) |
| 651 XSETINT (arg, - XFASTINT (arg)); | 651 XSETINT (arg, - XFASTINT (arg)); |
| 652 | 652 |
| 653 return arg; | 653 return arg; |
| 658 (arg) | 658 (arg) |
| 659 register Lisp_Object arg; | 659 register Lisp_Object arg; |
| 660 { | 660 { |
| 661 CHECK_NUMBER_OR_FLOAT (arg, 0); | 661 CHECK_NUMBER_OR_FLOAT (arg, 0); |
| 662 | 662 |
| 663 if (XTYPE (arg) == Lisp_Int) | 663 if (INTEGERP (arg)) |
| 664 return make_float ((double) XINT (arg)); | 664 return make_float ((double) XINT (arg)); |
| 665 else /* give 'em the same float back */ | 665 else /* give 'em the same float back */ |
| 666 return arg; | 666 return arg; |
| 667 } | 667 } |
| 668 | 668 |
| 720 (arg) | 720 (arg) |
| 721 register Lisp_Object arg; | 721 register Lisp_Object arg; |
| 722 { | 722 { |
| 723 CHECK_NUMBER_OR_FLOAT (arg, 0); | 723 CHECK_NUMBER_OR_FLOAT (arg, 0); |
| 724 | 724 |
| 725 if (XTYPE (arg) == Lisp_Float) | 725 if (FLOATP (arg)) |
| 726 { | 726 { |
| 727 double d; | 727 double d; |
| 728 | 728 |
| 729 IN_FLOAT (d = ceil (XFLOAT (arg)->data), "ceiling", arg); | 729 IN_FLOAT (d = ceil (XFLOAT (arg)->data), "ceiling", arg); |
| 730 FLOAT_TO_INT (d, arg, "ceiling", arg); | 730 FLOAT_TO_INT (d, arg, "ceiling", arg); |
| 749 int i1, i2; | 749 int i1, i2; |
| 750 | 750 |
| 751 CHECK_NUMBER_OR_FLOAT (divisor, 1); | 751 CHECK_NUMBER_OR_FLOAT (divisor, 1); |
| 752 | 752 |
| 753 #ifdef LISP_FLOAT_TYPE | 753 #ifdef LISP_FLOAT_TYPE |
| 754 if (XTYPE (arg) == Lisp_Float || XTYPE (divisor) == Lisp_Float) | 754 if (FLOATP (arg) || FLOATP (divisor)) |
| 755 { | 755 { |
| 756 double f1, f2; | 756 double f1, f2; |
| 757 | 757 |
| 758 f1 = XTYPE (arg) == Lisp_Float ? XFLOAT (arg)->data : XINT (arg); | 758 f1 = FLOATP (arg) ? XFLOAT (arg)->data : XINT (arg); |
| 759 f2 = (XTYPE (divisor) == Lisp_Float | 759 f2 = (FLOATP (divisor) ? XFLOAT (divisor)->data : XINT (divisor)); |
| 760 ? XFLOAT (divisor)->data : XINT (divisor)); | |
| 761 if (f2 == 0) | 760 if (f2 == 0) |
| 762 Fsignal (Qarith_error, Qnil); | 761 Fsignal (Qarith_error, Qnil); |
| 763 | 762 |
| 764 IN_FLOAT2 (f1 = floor (f1 / f2), "floor", arg, divisor); | 763 IN_FLOAT2 (f1 = floor (f1 / f2), "floor", arg, divisor); |
| 765 FLOAT_TO_INT2 (f1, arg, "floor", arg, divisor); | 764 FLOAT_TO_INT2 (f1, arg, "floor", arg, divisor); |
| 782 XSET (arg, Lisp_Int, i1); | 781 XSET (arg, Lisp_Int, i1); |
| 783 return arg; | 782 return arg; |
| 784 } | 783 } |
| 785 | 784 |
| 786 #ifdef LISP_FLOAT_TYPE | 785 #ifdef LISP_FLOAT_TYPE |
| 787 if (XTYPE (arg) == Lisp_Float) | 786 if (FLOATP (arg)) |
| 788 { | 787 { |
| 789 double d; | 788 double d; |
| 790 IN_FLOAT (d = floor (XFLOAT (arg)->data), "floor", arg); | 789 IN_FLOAT (d = floor (XFLOAT (arg)->data), "floor", arg); |
| 791 FLOAT_TO_INT (d, arg, "floor", arg); | 790 FLOAT_TO_INT (d, arg, "floor", arg); |
| 792 } | 791 } |
| 802 (arg) | 801 (arg) |
| 803 register Lisp_Object arg; | 802 register Lisp_Object arg; |
| 804 { | 803 { |
| 805 CHECK_NUMBER_OR_FLOAT (arg, 0); | 804 CHECK_NUMBER_OR_FLOAT (arg, 0); |
| 806 | 805 |
| 807 if (XTYPE (arg) == Lisp_Float) | 806 if (FLOATP (arg)) |
| 808 { | 807 { |
| 809 double d; | 808 double d; |
| 810 | 809 |
| 811 /* Screw the prevailing rounding mode. */ | 810 /* Screw the prevailing rounding mode. */ |
| 812 IN_FLOAT (d = rint (XFLOAT (arg)->data), "round", arg); | 811 IN_FLOAT (d = rint (XFLOAT (arg)->data), "round", arg); |
| 822 (arg) | 821 (arg) |
| 823 register Lisp_Object arg; | 822 register Lisp_Object arg; |
| 824 { | 823 { |
| 825 CHECK_NUMBER_OR_FLOAT (arg, 0); | 824 CHECK_NUMBER_OR_FLOAT (arg, 0); |
| 826 | 825 |
| 827 if (XTYPE (arg) == Lisp_Float) | 826 if (FLOATP (arg)) |
| 828 { | 827 { |
| 829 double d; | 828 double d; |
| 830 | 829 |
| 831 d = XFLOAT (arg)->data; | 830 d = XFLOAT (arg)->data; |
| 832 FLOAT_TO_INT (d, arg, "truncate", arg); | 831 FLOAT_TO_INT (d, arg, "truncate", arg); |
