X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=src%2Ffloatfns.c;h=337c58166455837b0706c20c2b214aab00b9f05e;hb=975655e6b5b1526ee82b159b3eadf69888c42090;hp=5e86a98e3431313020a6396ebbc62f5a42587f81;hpb=ea1ea793fe6e244ef5555ed983423a204101af13;p=chise%2Fxemacs-chise.git- diff --git a/src/floatfns.c b/src/floatfns.c index 5e86a98..337c581 100644 --- a/src/floatfns.c +++ b/src/floatfns.c @@ -55,9 +55,13 @@ Boston, MA 02111-1307, USA. */ #define THIS_FILENAME floatfns #include "sysfloat.h" -#ifndef HAVE_RINT +/* The code uses emacs_rint, so that it works to undefine HAVE_RINT + if `rint' exists but does not work right. */ +#ifdef HAVE_RINT +#define emacs_rint rint +#else static double -rint (double x) +emacs_rint (double x) { double r = floor (x + 0.5); double diff = fabs (r - x); @@ -75,7 +79,7 @@ static int in_float; /* If an argument is out of range for a mathematical function, here is the actual argument value to use in the error message. */ static Lisp_Object float_error_arg, float_error_arg2; -static CONST char *float_error_fn_name; +static const char *float_error_fn_name; /* Evaluate the floating point expression D, recording NUM as the original argument for error messages. @@ -122,7 +126,7 @@ static CONST char *float_error_fn_name; /* Convert float to Lisp Integer if it fits, else signal a range error using the given arguments. */ static Lisp_Object -float_to_int (double x, CONST char *name, Lisp_Object num, Lisp_Object num2) +float_to_int (double x, const char *name, Lisp_Object num, Lisp_Object num2) { if (x >= ((EMACS_INT) 1 << (VALBITS-1)) || x <= - ((EMACS_INT) 1 << (VALBITS-1)) - (EMACS_INT) 1) @@ -186,7 +190,7 @@ static const struct lrecord_description float_description[] = { DEFINE_BASIC_LRECORD_IMPLEMENTATION ("float", float, mark_float, print_float, 0, float_equal, float_hash, float_description, - struct Lisp_Float); + Lisp_Float); /* Extract a Lisp number as a `double', or signal an error. */ @@ -701,19 +705,19 @@ This is the same as the exponent of a float. double f = extract_float (arg); if (f == 0.0) - return make_int (- (int)((((EMACS_UINT) 1) << (VALBITS - 1)))); /* most-negative-fixnum */ + return make_int (- (EMACS_INT)(((EMACS_UINT) 1) << (VALBITS - 1))); /* most-negative-fixnum */ #ifdef HAVE_LOGB { Lisp_Object val; - IN_FLOAT (val = make_int ((int) logb (f)), "logb", arg); - return (val); + IN_FLOAT (val = make_int ((EMACS_INT) logb (f)), "logb", arg); + return val; } #else #ifdef HAVE_FREXP { int exqp; IN_FLOAT (frexp (f, &exqp), "logb", arg); - return (make_int (exqp - 1)); + return make_int (exqp - 1); } #else { @@ -737,7 +741,7 @@ This is the same as the exponent of a float. f /= d; val += i; } - return (make_int (val)); + return make_int (val); } #endif /* ! HAVE_FREXP */ #endif /* ! HAVE_LOGB */ @@ -831,7 +835,7 @@ Return the nearest integer to ARG. { double d; /* Screw the prevailing rounding mode. */ - IN_FLOAT ((d = rint (XFLOAT_DATA (arg))), "round", arg); + IN_FLOAT ((d = emacs_rint (XFLOAT_DATA (arg))), "round", arg); return (float_to_int (d, "round", arg, Qunbound)); } #endif /* LISP_FLOAT_TYPE */ @@ -891,7 +895,7 @@ Return the nearest integer to ARG, as a float. (arg)) { double d = extract_float (arg); - IN_FLOAT (d = rint (d), "fround", arg); + IN_FLOAT (d = emacs_rint (d), "fround", arg); return make_float (d); } @@ -984,6 +988,7 @@ init_floatfns_very_early (void) void syms_of_floatfns (void) { + INIT_LRECORD_IMPLEMENTATION (float); /* Trig functions. */