Mercurial > emacs
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 |