/* ceill()
* floorl ( )
* frexpl ( )
* ldexpl ( )
* fabsl ( )
* signbitl ( )
* isnanl ( )
* isfinitel ( )
*
* Floating point numeric utilities
*
*
*
* SYNOPSIS :
*
* long double ceill ( ) , floorl ( ) , frexpl ( ) , ldexpl ( ) , fabsl ( ) ;
* int signbitl ( ) , isnanl ( ) , isfinitel ( ) ;
* long double x , y ;
* int expnt , n ;
*
* y = floorl ( x ) ;
* y = ceill ( x ) ;
* y = frexpl ( x , & expnt ) ;
* y = ldexpl ( x , n ) ;
* y = fabsl ( x ) ;
* n = signbitl ( x ) ;
* n = isnanl ( x ) ;
* n = isfinitel ( x ) ;
*
*
*
* DESCRIPTION :
*
* The following routines return a long double precision floating point
* result :
*
* floorl ( ) returns the largest integer less than or equal to x .
* It truncates toward minus infinity .
*
* ceill ( ) returns the smallest integer greater than or equal
* to x . It truncates toward plus infinity .
*
* frexpl ( ) extracts the exponent from x . It returns an integer
* power of two to expnt and the significand between 0 . 5 and 1
* to y . Thus x = y * 2 * * expn .
*
* ldexpl ( ) multiplies x by 2 * * n .
*
* fabsl ( ) returns the absolute value of its argument .
*
* These functions are part of the standard C run time library
* for some but not all C compilers . The ones supplied are
* written in C for IEEE arithmetic . They should
* be used only if your compiler library does not already have
* them .
*
* The IEEE versions assume that denormal numbers are implemented
* in the arithmetic . Some modifications will be required if
* the arithmetic has abrupt rather than gradual underflow .
*/
/*
Cephes Math Library Release 2 . 7 : May , 1998
Copyright 1984 , 1987 , 1988 , 1992 , 1998 by Stephen L . Moshier
*/
#include "mconf.h"
/* This is defined in mconf.h. */
/* #define DENORMAL 1 */
#ifdef UNK
/* Change UNK into something else. */
#undef UNK
#if BIGENDIAN
#define MIEEE 1
#else
#define IBMPC 1
#endif
#endif
#ifdef IBMPC
#define EXPMSK 0 x800f
#define MEXP 0 x7ff
#define NBITS 64
#endif
#ifdef MIEEE
#define EXPMSK 0 x800f
#define MEXP 0 x7ff
#define NBITS 64
#endif
extern double MAXNUML;
#ifdef ANSIPROT
extern long double fabsl ( long double );
extern long double floorl ( long double );
extern int isnanl ( long double );
#else
long double fabsl(), floorl();
int isnanl();
#endif
#ifdef INFINITIES
extern long double INFINITYL;
#endif
#ifdef NANS
extern long double NANL;
#endif
long double fabsl(x)
long double x;
{
union
{
long double d;
short i[6 ];
} u;
u.d = x;
#ifdef IBMPC
u.i[4 ] &= 0 x7fff;
#endif
#ifdef MIEEE
u.i[0 ] &= 0 x7fff;
#endif
return ( u.d );
}
long double ceill(x)
long double x;
{
long double y;
#ifdef UNK
mtherr( "ceill" , DOMAIN );
return (0 .0 L);
#endif
#ifdef INFINITIES
if (x == -INFINITYL)
return (x);
#endif
#ifdef MINUSZERO
if (x == 0 .0 L)
return (x);
#endif
y = floorl(x);
if ( y < x )
y += 1 .0 L;
return (y);
}
/* Bit clearing masks: */
static unsigned short bmask[] = {
0 xffff,
0 xfffe,
0 xfffc,
0 xfff8,
0 xfff0,
0 xffe0,
0 xffc0,
0 xff80,
0 xff00,
0 xfe00,
0 xfc00,
0 xf800,
0 xf000,
0 xe000,
0 xc000,
0 x8000,
0 x0000,
};
long double floorl(x)
long double x;
{
unsigned short *p;
union
{
long double y;
unsigned short sh[6 ];
} u;
int e;
#ifdef UNK
mtherr( "floor" , DOMAIN );
return (0 .0 L);
#endif
#ifdef INFINITIES
if ( x == INFINITYL )
return (x);
#endif
#ifdef MINUSZERO
if (x == 0 .0 L)
return (x);
#endif
u.y = x;
/* find the exponent (power of 2) */
#ifdef IBMPC
p = (unsigned short *)&u.sh[4 ];
e = (*p & 0 x7fff) - 0 x3fff;
p -= 4 ;
#endif
#ifdef MIEEE
p = (unsigned short *)&u.sh[0 ];
e = (*p & 0 x7fff) - 0 x3fff;
p += 5 ;
#endif
if ( e < 0 )
{
if ( u.y < 0 .0 L )
return ( -1 .0 L );
else
return ( 0 .0 L );
}
e = (NBITS -1 ) - e;
/* clean out 16 bits at a time */
while ( e >= 16 )
{
#ifdef IBMPC
*p++ = 0 ;
#endif
#ifdef MIEEE
*p-- = 0 ;
#endif
e -= 16 ;
}
/* clear the remaining bits */
if ( e > 0 )
*p &= bmask[e];
if ( (x < 0 ) && (u.y != x) )
u.y -= 1 .0 L;
return (u.y);
}
long double frexpl( x, pw2 )
long double x;
int *pw2;
{
union
{
long double y;
unsigned short sh[6 ];
} u;
int i, k;
short *q;
u.y = x;
#ifdef NANS
if (isnanl(x))
{
*pw2 = 0 ;
return (x);
}
#endif
#ifdef INFINITIES
if (x == -INFINITYL)
{
*pw2 = 0 ;
return (x);
}
#endif
#ifdef MINUSZERO
if (x == 0 .0 L)
{
*pw2 = 0 ;
return (x);
}
#endif
#ifdef UNK
mtherr( "frexpl" , DOMAIN );
return (0 .0 L);
#endif
/* find the exponent (power of 2) */
#ifdef IBMPC
q = (short *)&u.sh[4 ];
i = *q & 0 x7fff;
#endif
#ifdef MIEEE
q = (short *)&u.sh[0 ];
i = *q & 0 x7fff;
#endif
if ( i == 0 )
{
if ( u.y == 0 .0 L )
{
*pw2 = 0 ;
return (0 .0 L);
}
/* Number is denormal or zero */
#ifdef DENORMAL
/* Handle denormal number. */
do
{
u.y *= 2 .0 L;
i -= 1 ;
k = *q & 0 x7fff;
}
while ( (k == 0 ) && (i > -66 ) );
i = i + k;
#else
*pw2 = 0 ;
return (0 .0 L);
#endif /* DENORMAL */
}
*pw2 = i - 0 x3ffe;
/* *q = 0x3ffe; */
/* Preserve sign of argument. */
*q &= 0 x8000;
*q |= 0 x3ffe;
return ( u.y );
}
long double ldexpl( x, pw2 )
long double x;
int pw2;
{
union
{
long double y;
unsigned short sh[6 ];
} u;
unsigned short *q;
long e;
#ifdef UNK
mtherr( "ldexp" , DOMAIN );
return (0 .0 L);
#endif
u.y = x;
#ifdef IBMPC
q = (unsigned short *)&u.sh[4 ];
#endif
#ifdef MIEEE
q = (unsigned short *)&u.sh[0 ];
#endif
while ( (e = (*q & 0 x7fffL)) == 0 )
{
#ifdef DENORMAL
if ( u.y == 0 .0 L )
{
return ( 0 .0 L );
}
/* Input is denormal. */
if ( pw2 > 0 )
{
u.y *= 2 .0 L;
pw2 -= 1 ;
}
if ( pw2 < 0 )
{
if ( pw2 < -64 )
return (0 .0 L);
u.y *= 0 .5 L;
pw2 += 1 ;
}
if ( pw2 == 0 )
return (u.y);
#else
return ( 0 .0 L );
#endif
}
e = e + pw2;
/* Handle overflow */
if ( e > 0 x7fffL )
{
return ( MAXNUML );
}
*q &= 0 x8000;
/* Handle denormalized results */
if ( e < 1 )
{
#ifdef DENORMAL
if ( e < -64 )
return (0 .0 L);
#ifdef IBMPC
*(q-1 ) |= 0 x8000;
#endif
#ifdef MIEEE
*(q+2 ) |= 0 x8000;
#endif
while ( e < 1 )
{
u.y *= 0 .5 L;
e += 1 ;
}
e = 0 ;
#else
return (0 .0 L);
#endif
}
*q |= (unsigned short ) e & 0 x7fff;
return (u.y);
}
Messung V0.5 in Prozent C=96 H=94 G=94
¤ Dauer der Verarbeitung: 0.1 Sekunden
(vorverarbeitet am 2026-06-14)
¤
*© Formatika GbR, Deutschland