Add roundl(), lroundl(), and llroundl().

This commit is contained in:
David Schultz 2005-04-08 01:24:08 +00:00
parent 4bb190a74b
commit 07f3bc5b9c
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=144772
7 changed files with 120 additions and 18 deletions

View File

@ -47,12 +47,12 @@ COMMON_SRCS= b_exp.c b_log.c b_tgamma.c \
s_fmax.c s_fmaxf.c s_fmaxl.c s_fmin.c \
s_fminf.c s_fminl.c s_frexp.c s_frexpf.c s_ilogb.c s_ilogbf.c \
s_ilogbl.c s_isfinite.c s_isnan.c s_isnormal.c \
s_llrint.c s_llrintf.c s_llround.c s_llroundf.c \
s_llrint.c s_llrintf.c s_llround.c s_llroundf.c s_llroundl.c \
s_log1p.c s_log1pf.c s_logb.c s_logbf.c s_lrint.c s_lrintf.c \
s_lround.c s_lroundf.c s_modff.c \
s_lround.c s_lroundf.c s_lroundl.c s_modff.c \
s_nearbyint.c s_nextafter.c s_nextafterf.c \
s_nexttowardf.c s_remquo.c s_remquof.c \
s_rint.c s_rintf.c s_round.c s_roundf.c \
s_rint.c s_rintf.c s_round.c s_roundf.c s_roundl.c \
s_scalbln.c s_scalbn.c s_scalbnf.c s_signbit.c \
s_signgam.c s_significand.c s_significandf.c s_sin.c s_sinf.c s_tan.c \
s_tanf.c s_tanh.c s_tanhf.c s_trunc.c s_truncf.c \
@ -137,14 +137,15 @@ MLINKS+=j0.3 j1.3 j0.3 jn.3 j0.3 y0.3 j0.3 y1.3 j0.3 y1f.3 j0.3 yn.3
MLINKS+=j0.3 j0f.3 j0.3 j1f.3 j0.3 jnf.3 j0.3 y0f.3 j0.3 ynf.3
MLINKS+=lgamma.3 gamma.3 lgamma.3 gammaf.3 lgamma.3 lgammaf.3 lgamma.3 tgamma.3
MLINKS+=lrint.3 llrint.3 lrint.3 llrintf.3 lrint.3 lrintf.3
MLINKS+=lround.3 llround.3 lround.3 llroundf.3 lround.3 lroundf.3
MLINKS+=lround.3 llround.3 lround.3 llroundf.3 lround.3 llroundl.3 \
lround.3 lroundf.3 lround.3 lroundl.3
MLINKS+=nextafter.3 nextafterf.3 nextafter.3 nextafterl.3
MLINKS+=nextafter.3 nexttoward.3 nextafter.3 nexttowardf.3
MLINKS+=nextafter.3 nexttowardl.3
MLINKS+=remainder.3 remainderf.3
MLINKS+=remainder.3 remquo.3 remainder.3 remquof.3
MLINKS+=rint.3 rintf.3 rint.3 nearbyint.3 rint.3 nearbyintf.3
MLINKS+=round.3 roundf.3
MLINKS+=round.3 roundf.3 round.3 roundl.3
MLINKS+=scalbn.3 scalbln.3 scalbn.3 scalblnf.3 scalbn.3 scalblnl.3
MLINKS+=scalbn.3 scalbnf.3 scalbn.3 scalbnl.3
MLINKS+=sin.3 sinf.3

View File

@ -24,14 +24,16 @@
.\"
.\" $FreeBSD$
.\"
.Dd January 11, 2005
.Dd April 7, 2005
.Dt LROUND 3
.Os
.Sh NAME
.Nm llround ,
.Nm llroundf ,
.Nm llroundl ,
.Nm lround ,
.Nm lroundf
.Nm lroundf ,
.Nm lroundl
.Nd "convert to nearest integral value"
.Sh LIBRARY
.Lb libm
@ -41,10 +43,14 @@
.Fn llround "double x"
.Ft "long long"
.Fn llroundf "float x"
.Ft "long long"
.Fn llroundl "long double x"
.Ft long
.Fn lround "double x"
.Ft long
.Fn lroundf "float x"
.Ft long
.Fn lroundl "long double x"
.Sh DESCRIPTION
The
.Fn lround
@ -70,8 +76,10 @@ is equivalent to
The
.Fn llround ,
.Fn llroundf ,
and
.Fn llroundl ,
.Fn lroundf
and
.Fn lroundl
functions differ from
.Fn lround
only in their input and output types.
@ -84,11 +92,21 @@ only in their input and output types.
The
.Fn llround ,
.Fn llroundf ,
.Fn llroundl ,
.Fn lround ,
.Fn lroundf ,
and
.Fn lroundf
.Fn lroundl
functions conform to
.St -isoC-99 .
.Sh HISTORY
These routines first appeared in
The
.Ft float
and
.Ft double
versions of these routines first appeared in
.Fx 5.4 .
The
.Ft long double
versions appeared in
.Fx 6.0 .

View File

@ -24,12 +24,13 @@
.\"
.\" $FreeBSD$
.\"
.Dd November 29, 2003
.Dd April 7, 2005
.Dt ROUND 3
.Os
.Sh NAME
.Nm round ,
.Nm roundf
.Nm roundf ,
.Nm roundl
.Nd round to nearest integral value
.Sh LIBRARY
.Lb libm
@ -39,11 +40,14 @@
.Fn round "double x"
.Ft float
.Fn roundf "float x"
.Ft long double
.Fn roundl "long double x"
.Sh DESCRIPTION
The
.Fn round
.Fn round ,
.Fn roundf ,
and
.Fn roundf
.Fn roundl
functions return the nearest integral value to
.Fa x ;
if
@ -61,9 +65,7 @@ absolute value (i.e., they round away from zero).
.Xr rint 3 ,
.Xr trunc 3
.Sh STANDARDS
The
.Fn round
function conforms to
These functions conform to
.St -isoC-99 .
.Sh HISTORY
The
@ -72,3 +74,7 @@ and
.Fn roundf
functions appeared in
.Fx 5.3 .
The
.Fn roundl
function appeared in
.Fx 6.0 .

View File

@ -428,14 +428,18 @@ long double ldexpl(long double, int);
#if 0
long double lgammal(long double);
long long llrintl(long double);
#endif
long long llroundl(long double);
#if 0
long double log10l(long double);
long double log1pl(long double);
long double log2l(long double);
long double logbl(long double);
long double logl(long double);
long lrintl(long double);
#endif
long lroundl(long double);
#if 0
long double modfl(long double, long double *); /* fundamentally !__pure2 */
long double nanl(const char *) __pure2;
long double nearbyintl(long double);
@ -449,8 +453,8 @@ long double powl(long double, long double);
long double remainderl(long double, long double);
long double remquol(long double, long double, int *);
long double rintl(long double);
long double roundl(long double);
#endif
long double roundl(long double);
long double scalblnl(long double, long);
long double scalbnl(long double, int);
#if 0

11
lib/msun/src/s_llroundl.c Normal file
View File

@ -0,0 +1,11 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
#define type long double
#define roundit roundl
#define dtype long long
#define DTYPE_MIN LLONG_MIN
#define DTYPE_MAX LLONG_MAX
#define fn llroundl
#include "s_lround.c"

11
lib/msun/src/s_lroundl.c Normal file
View File

@ -0,0 +1,11 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
#define type long double
#define roundit roundl
#define dtype long
#define DTYPE_MIN LONG_MIN
#define DTYPE_MAX LONG_MAX
#define fn lroundl
#include "s_lround.c"

51
lib/msun/src/s_roundl.c Normal file
View File

@ -0,0 +1,51 @@
/*-
* Copyright (c) 2003, Steven G. Kargl
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice unmodified, this list of conditions, and the following
* disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
#include <math.h>
long double
roundl(long double x)
{
long double t;
if (!isfinite(x))
return (x);
if (x >= 0.0) {
t = ceill(x);
if (t - x > 0.5)
t -= 1.0;
return (t);
} else {
t = ceill(-x);
if (t + x > 0.5)
t -= 1.0;
return (-t);
}
}