mirror of
https://github.com/freebsd/freebsd-src.git
synced 2024-11-28 19:52:44 +00:00
Implement trunc() and truncf().
This commit is contained in:
parent
2f90a15e14
commit
7ffaea8021
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=130767
74
lib/msun/man/trunc.3
Normal file
74
lib/msun/man/trunc.3
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
.\" Copyright (c) 2004 David Schultz <das@FreeBSD.org>
|
||||||
|
.\" 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, 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 AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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.
|
||||||
|
.\"
|
||||||
|
.\" $FreeBSD$
|
||||||
|
.\"
|
||||||
|
.Dd June 20, 2004
|
||||||
|
.Dt TRUNC 3
|
||||||
|
.Os
|
||||||
|
.Sh NAME
|
||||||
|
.Nm trunc ,
|
||||||
|
.Nm truncf
|
||||||
|
.Nd nearest integral value with magnitude less than or equal to |x|
|
||||||
|
.Sh LIBRARY
|
||||||
|
.Lb libm
|
||||||
|
.Sh SYNOPSIS
|
||||||
|
.In math.h
|
||||||
|
.Ft double
|
||||||
|
.Fn trunc "double x"
|
||||||
|
.Ft float
|
||||||
|
.Fn truncf "float x"
|
||||||
|
.Sh DESCRIPTION
|
||||||
|
The
|
||||||
|
.Fn trunc
|
||||||
|
and
|
||||||
|
.Fn truncf
|
||||||
|
functions return the nearest integral value with magnitude less than
|
||||||
|
or equal to
|
||||||
|
.Pf | Fa x Ns | .
|
||||||
|
They are equivalent to
|
||||||
|
.Fn rint
|
||||||
|
and
|
||||||
|
.Fn rintf ,
|
||||||
|
respectively, in the
|
||||||
|
.Dv FE_TOWARDZERO
|
||||||
|
rounding mode.
|
||||||
|
.Sh SEE ALSO
|
||||||
|
.Xr ceil 3 ,
|
||||||
|
.Xr fesetround 3 ,
|
||||||
|
.Xr floor 3 ,
|
||||||
|
.Xr math 3 ,
|
||||||
|
.Xr nextafter 3 ,
|
||||||
|
.Xr rint 3 ,
|
||||||
|
.Xr round 3
|
||||||
|
.Sh STANDARDS
|
||||||
|
The
|
||||||
|
.Fn trunc
|
||||||
|
and
|
||||||
|
.Fn truncf
|
||||||
|
functions conform to
|
||||||
|
.St -isoC-99 .
|
||||||
|
.Sh HISTORY
|
||||||
|
These routines first appeared in
|
||||||
|
.Fx 5.3 .
|
61
lib/msun/src/s_trunc.c
Normal file
61
lib/msun/src/s_trunc.c
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
/* @(#)s_floor.c 5.1 93/09/24 */
|
||||||
|
/*
|
||||||
|
* ====================================================
|
||||||
|
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
|
||||||
|
*
|
||||||
|
* Developed at SunPro, a Sun Microsystems, Inc. business.
|
||||||
|
* Permission to use, copy, modify, and distribute this
|
||||||
|
* software is freely granted, provided that this notice
|
||||||
|
* is preserved.
|
||||||
|
* ====================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sys/cdefs.h>
|
||||||
|
__FBSDID("$FreeBSD$");
|
||||||
|
|
||||||
|
/*
|
||||||
|
* trunc(x)
|
||||||
|
* Return x rounded toward 0 to integral value
|
||||||
|
* Method:
|
||||||
|
* Bit twiddling.
|
||||||
|
* Exception:
|
||||||
|
* Inexact flag raised if x not equal to trunc(x).
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "math.h"
|
||||||
|
#include "math_private.h"
|
||||||
|
|
||||||
|
static const double huge = 1.0e300;
|
||||||
|
|
||||||
|
double
|
||||||
|
trunc(double x)
|
||||||
|
{
|
||||||
|
int32_t i0,i1,j0;
|
||||||
|
u_int32_t i,j;
|
||||||
|
EXTRACT_WORDS(i0,i1,x);
|
||||||
|
j0 = ((i0>>20)&0x7ff)-0x3ff;
|
||||||
|
if(j0<20) {
|
||||||
|
if(j0<0) { /* raise inexact if x != 0 */
|
||||||
|
if(huge+x>0.0) {/* |x|<1, so return 0*sign(x) */
|
||||||
|
i0 &= 0x80000000U;
|
||||||
|
i1 = 0;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
i = (0x000fffff)>>j0;
|
||||||
|
if(((i0&i)|i1)==0) return x; /* x is integral */
|
||||||
|
if(huge+x>0.0) { /* raise inexact flag */
|
||||||
|
i0 &= (~i); i1=0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (j0>51) {
|
||||||
|
if(j0==0x400) return x+x; /* inf or NaN */
|
||||||
|
else return x; /* x is integral */
|
||||||
|
} else {
|
||||||
|
i = ((u_int32_t)(0xffffffff))>>(j0-20);
|
||||||
|
if((i1&i)==0) return x; /* x is integral */
|
||||||
|
if(huge+x>0.0) /* raise inexact flag */
|
||||||
|
i1 &= (~i);
|
||||||
|
}
|
||||||
|
INSERT_WORDS(x,i0,i1);
|
||||||
|
return x;
|
||||||
|
}
|
53
lib/msun/src/s_truncf.c
Normal file
53
lib/msun/src/s_truncf.c
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
/* @(#)s_floor.c 5.1 93/09/24 */
|
||||||
|
/*
|
||||||
|
* ====================================================
|
||||||
|
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
|
||||||
|
*
|
||||||
|
* Developed at SunPro, a Sun Microsystems, Inc. business.
|
||||||
|
* Permission to use, copy, modify, and distribute this
|
||||||
|
* software is freely granted, provided that this notice
|
||||||
|
* is preserved.
|
||||||
|
* ====================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sys/cdefs.h>
|
||||||
|
__FBSDID("$FreeBSD$");
|
||||||
|
|
||||||
|
/*
|
||||||
|
* truncf(x)
|
||||||
|
* Return x rounded toward 0 to integral value
|
||||||
|
* Method:
|
||||||
|
* Bit twiddling.
|
||||||
|
* Exception:
|
||||||
|
* Inexact flag raised if x not equal to truncf(x).
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "math.h"
|
||||||
|
#include "math_private.h"
|
||||||
|
|
||||||
|
static const float huge = 1.0e30F;
|
||||||
|
|
||||||
|
float
|
||||||
|
truncf(float x)
|
||||||
|
{
|
||||||
|
int32_t i0,j0;
|
||||||
|
u_int32_t i;
|
||||||
|
GET_FLOAT_WORD(i0,x);
|
||||||
|
j0 = ((i0>>23)&0xff)-0x7f;
|
||||||
|
if(j0<23) {
|
||||||
|
if(j0<0) { /* raise inexact if x != 0 */
|
||||||
|
if(huge+x>0.0F) /* |x|<1, so return 0*sign(x) */
|
||||||
|
i0 &= 0x80000000;
|
||||||
|
} else {
|
||||||
|
i = (0x007fffff)>>j0;
|
||||||
|
if((i0&i)==0) return x; /* x is integral */
|
||||||
|
if(huge+x>0.0F) /* raise inexact flag */
|
||||||
|
i0 &= (~i);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if(j0==0x80) return x+x; /* inf or NaN */
|
||||||
|
else return x; /* x is integral */
|
||||||
|
}
|
||||||
|
SET_FLOAT_WORD(x,i0);
|
||||||
|
return x;
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user