aboutsummaryrefslogtreecommitdiffstats
path: root/src/floatfns.c
diff options
context:
space:
mode:
authorKarl Heuer1994-03-15 03:16:05 +0000
committerKarl Heuer1994-03-15 03:16:05 +0000
commit6694b327c4b5f6001ae9c50097ba383619efceb0 (patch)
treedfd12f485d0d4d7df93b75ba9a09c3e5e692de8e /src/floatfns.c
parentc2d606f4c00b35ce52cb92dff423bfac03f14299 (diff)
downloademacs-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.c39
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