summaryrefslogtreecommitdiff
path: root/libm/s_ldexp.c
diff options
context:
space:
mode:
Diffstat (limited to 'libm/s_ldexp.c')
-rw-r--r--libm/s_ldexp.c36
1 files changed, 19 insertions, 17 deletions
diff --git a/libm/s_ldexp.c b/libm/s_ldexp.c
index ffc268b52..bc0f08e99 100644
--- a/libm/s_ldexp.c
+++ b/libm/s_ldexp.c
@@ -1,4 +1,3 @@
-/* @(#)s_ldexp.c 5.1 93/09/24 */
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
@@ -10,28 +9,31 @@
* ====================================================
*/
-#if defined(LIBM_SCCS) && !defined(lint)
-static char rcsid[] = "$NetBSD: s_ldexp.c,v 1.6 1995/05/10 20:47:40 jtc Exp $";
-#endif
-
#include "math.h"
#include "math_private.h"
#include <errno.h>
-libm_hidden_proto(scalbn)
-libm_hidden_proto(finite)
+/* TODO: POSIX says:
+ *
+ * "If the integer expression (math_errhandling & MATH_ERRNO) is non-zero,
+ * then errno shall be set to [ERANGE]. If the integer expression
+ * (math_errhandling & MATH_ERREXCEPT) is non-zero, then the underflow
+ * floating-point exception shall be raised."
+ *
+ * *And it says the same about scalbn*! Thus these two functions
+ * are the same and can be just aliased.
+ *
+ * Currently, ldexp tries to be vaguely POSIX compliant while scalbn
+ * does not (it does not set ERRNO).
+ */
-libm_hidden_proto(ldexp)
-#ifdef __STDC__
- double ldexp(double value, int exp)
-#else
- double ldexp(value, exp)
- double value; int exp;
-#endif
+double ldexp(double value, int _exp)
{
- if(!finite(value)||value==0.0) return value;
- value = scalbn(value,exp);
- if(!finite(value)||value==0.0) errno = ERANGE;
+ if (!isfinite(value) || value == 0.0)
+ return value;
+ value = scalbn(value, _exp);
+ if (!isfinite(value) || value == 0.0)
+ errno = ERANGE;
return value;
}
libm_hidden_def(ldexp)