#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);
/* 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.
#define arith_error(op,arg) \
- Fsignal (Qarith_error, list2 (build_string ((op)), (arg)))
+ Fsignal (Qarith_error, list2 (build_string (op), arg))
#define range_error(op,arg) \
- Fsignal (Qrange_error, list2 (build_string ((op)), (arg)))
+ Fsignal (Qrange_error, list2 (build_string (op), arg))
#define range_error2(op,a1,a2) \
- Fsignal (Qrange_error, list3 (build_string ((op)), (a1), (a2)))
+ Fsignal (Qrange_error, list3 (build_string (op), a1, a2))
#define domain_error(op,arg) \
- Fsignal (Qdomain_error, list2 (build_string ((op)), (arg)))
+ Fsignal (Qdomain_error, list2 (build_string (op), arg))
#define domain_error2(op,a1,a2) \
- Fsignal (Qdomain_error, list3 (build_string ((op)), (a1), (a2)))
+ Fsignal (Qdomain_error, list3 (build_string (op), a1, a2))
/* 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)
\f
static Lisp_Object
-mark_float (Lisp_Object obj, void (*markobj) (Lisp_Object))
+mark_float (Lisp_Object obj)
{
return Qnil;
}
DEFINE_BASIC_LRECORD_IMPLEMENTATION ("float", float,
mark_float, print_float, 0, float_equal,
float_hash, float_description,
- struct Lisp_Float);
+ Lisp_Float);
\f
/* Extract a Lisp number as a `double', or signal an error. */
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
{
f /= d;
val += i;
}
- return (make_int (val));
+ return make_int (val);
}
#endif /* ! HAVE_FREXP */
#endif /* ! HAVE_LOGB */
{
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 */
(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);
}
void
syms_of_floatfns (void)
{
+ INIT_LRECORD_IMPLEMENTATION (float);
/* Trig functions. */