diff options
| author | Karl Heuer | 1994-03-15 03:16:05 +0000 |
|---|---|---|
| committer | Karl Heuer | 1994-03-15 03:16:05 +0000 |
| commit | 6694b327c4b5f6001ae9c50097ba383619efceb0 (patch) | |
| tree | dfd12f485d0d4d7df93b75ba9a09c3e5e692de8e /src/floatfns.c | |
| parent | c2d606f4c00b35ce52cb92dff423bfac03f14299 (diff) | |
| download | emacs-6694b327c4b5f6001ae9c50097ba383619efceb0.tar.gz emacs-6694b327c4b5f6001ae9c50097ba383619efceb0.zip | |
(Flogb): Check for 0.0. Emulate logb if needed.
Diffstat (limited to 'src/floatfns.c')
| -rw-r--r-- | src/floatfns.c | 39 |
1 files changed, 28 insertions, 11 deletions
diff --git a/src/floatfns.c b/src/floatfns.c index 27f8d084c03..81a42603b6a 100644 --- a/src/floatfns.c +++ b/src/floatfns.c | |||
| @@ -656,23 +656,40 @@ This is the same as the exponent of a float.") | |||
| 656 | int value; | 656 | int value; |
| 657 | double f = extract_float (arg); | 657 | double f = extract_float (arg); |
| 658 | 658 | ||
| 659 | if (f == 0.0) | ||
| 660 | value = -(VALMASK >> 1); | ||
| 661 | else | ||
| 662 | { | ||
| 659 | #ifdef HAVE_LOGB | 663 | #ifdef HAVE_LOGB |
| 660 | IN_FLOAT (value = logb (f), "logb", arg); | 664 | IN_FLOAT (value = logb (f), "logb", arg); |
| 661 | XSET (val, Lisp_Int, value); | ||
| 662 | #else | 665 | #else |
| 663 | #ifdef HAVE_FREXP | 666 | #ifdef HAVE_FREXP |
| 664 | { | 667 | IN_FLOAT (frexp (f, &value), "logb", arg); |
| 665 | int exp; | 668 | value--; |
| 666 | |||
| 667 | IN_FLOAT (frexp (f, &exp), "logb", arg); | ||
| 668 | XSET (val, Lisp_Int, exp-1); | ||
| 669 | } | ||
| 670 | #else | 669 | #else |
| 671 | /* Would someone like to write code to emulate logb? */ | 670 | int i; |
| 672 | error ("`logb' not implemented on this operating system"); | 671 | double d; |
| 672 | if (f < 0.0) | ||
| 673 | f = -f; | ||
| 674 | value = -1; | ||
| 675 | while (f < 0.5) | ||
| 676 | { | ||
| 677 | for (i = 1, d = 0.5; d * d >= f; i += i) | ||
| 678 | d *= d; | ||
| 679 | f /= d; | ||
| 680 | value -= i; | ||
| 681 | } | ||
| 682 | while (f >= 1.0) | ||
| 683 | { | ||
| 684 | for (i = 1, d = 2.0; d * d <= f; i += i) | ||
| 685 | d *= d; | ||
| 686 | f /= d; | ||
| 687 | value += i; | ||
| 688 | } | ||
| 673 | #endif | 689 | #endif |
| 674 | #endif | 690 | #endif |
| 675 | 691 | } | |
| 692 | XSET (val, Lisp_Int, value); | ||
| 676 | return val; | 693 | return val; |
| 677 | } | 694 | } |
| 678 | 695 | ||