# HG changeset patch # User Karl Heuer # Date 763701365 0 # Node ID 800c035273e926840110cf4d9d102584f0a7c175 # Parent 250e69a75938a2cb11b06fd5a05dc9f3ce2af23f (Flogb): Check for 0.0. Emulate logb if needed. diff -r 250e69a75938 -r 800c035273e9 src/floatfns.c --- a/src/floatfns.c Tue Mar 15 02:52:55 1994 +0000 +++ b/src/floatfns.c Tue Mar 15 03:16:05 1994 +0000 @@ -656,23 +656,40 @@ int value; double f = extract_float (arg); + if (f == 0.0) + value = -(VALMASK >> 1); + else + { #ifdef HAVE_LOGB - IN_FLOAT (value = logb (f), "logb", arg); - XSET (val, Lisp_Int, value); + IN_FLOAT (value = logb (f), "logb", arg); #else #ifdef HAVE_FREXP - { - int exp; - - IN_FLOAT (frexp (f, &exp), "logb", arg); - XSET (val, Lisp_Int, exp-1); - } + IN_FLOAT (frexp (f, &value), "logb", arg); + value--; #else - /* Would someone like to write code to emulate logb? */ - error ("`logb' not implemented on this operating system"); + int i; + double d; + if (f < 0.0) + f = -f; + value = -1; + while (f < 0.5) + { + for (i = 1, d = 0.5; d * d >= f; i += i) + d *= d; + f /= d; + value -= i; + } + while (f >= 1.0) + { + for (i = 1, d = 2.0; d * d <= f; i += i) + d *= d; + f /= d; + value += i; + } #endif #endif - + } + XSET (val, Lisp_Int, value); return val; }