comparison src/floatfns.c @ 6359:800c035273e9

(Flogb): Check for 0.0. Emulate logb if needed.
author Karl Heuer <kwzh@gnu.org>
date Tue, 15 Mar 1994 03:16:05 +0000
parents 9fd25ec7204b
children 212dcd2c06e4
comparison
equal deleted inserted replaced
6358:250e69a75938 6359:800c035273e9
654 { 654 {
655 Lisp_Object val; 655 Lisp_Object val;
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;
673 #endif 672 if (f < 0.0)
674 #endif 673 f = -f;
675 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 }
689 #endif
690 #endif
691 }
692 XSET (val, Lisp_Int, value);
676 return val; 693 return val;
677 } 694 }
678 695
679 /* the rounding functions */ 696 /* the rounding functions */
680 697