Files
RockOS/rocklibc/src/math/isnan.c

124 lines
2.3 KiB
C
Raw Normal View History

/* isnan( double )
This file is part of the Public Domain C Library (PDCLib).
Permission is granted to use, modify, and / or redistribute at will.
*/
#include <math.h>
#ifndef REGTEST
#include "pdclib/_PDCLIB_print.h"
#include <string.h>
int _PDCLIB_isnand( double x )
{
_PDCLIB_bigint_digit_t data[ sizeof( double ) / sizeof( _PDCLIB_bigint_digit_t ) ];
size_t size;
int exp;
memcpy( data, &x, sizeof( double ) );
exp = _PDCLIB_DBL_EXP( data );
size = _PDCLIB_DBL_SIZE( data );
if ( exp == ( ( _PDCLIB_DBL_MAX_EXP - 1 ) + _PDCLIB_DBL_MAX_EXP ) )
{
_PDCLIB_bigint_digit_t digit = 0;
size_t i;
for ( i = 0; i < size; ++i )
{
digit |= data[i];
}
return digit != 0;
}
return 0;
}
int _PDCLIB_isnanf( float x )
{
_PDCLIB_bigint_digit_t data[ sizeof( float ) / sizeof( _PDCLIB_bigint_digit_t ) ];
size_t size;
int exp;
memcpy( data, &x, sizeof( float ) );
exp = _PDCLIB_FLT_EXP( data );
size = _PDCLIB_FLT_SIZE( data );
if ( exp == ( ( _PDCLIB_FLT_MAX_EXP - 1 ) + _PDCLIB_FLT_MAX_EXP ) )
{
_PDCLIB_bigint_digit_t digit = 0;
size_t i;
for ( i = 0; i < size; ++i )
{
digit |= data[i];
}
return digit != 0;
}
return 0;
}
int _PDCLIB_isnanl( long double x )
{
_PDCLIB_bigint_digit_t data[ sizeof( long double ) / sizeof( _PDCLIB_bigint_digit_t ) ];
size_t size;
int exp;
memcpy( data, &x, sizeof( long double ) );
exp = _PDCLIB_LDBL_EXP( data );
size = _PDCLIB_LDBL_SIZE( data );
if ( exp == ( ( _PDCLIB_LDBL_MAX_EXP - 1 ) + _PDCLIB_LDBL_MAX_EXP ) )
{
_PDCLIB_bigint_digit_t digit = 0;
size_t i;
for ( i = 0; i < size; ++i )
{
digit |= data[i];
}
return digit != 0;
}
return 0;
}
#endif
#ifdef TEST
#include "_PDCLIB_test.h"
int main( void )
{
float f;
double d;
long double ld;
f = 1e100;
TESTCASE( isnan( f ) == 0 );
f = 0.0 / 0.0;
TESTCASE( isnan( f ) == 1 );
d = 1e500;
TESTCASE( isnan( d ) == 0 );
d = 0.0 / 0.0;
TESTCASE( isnan( d ) == 1 );
ld = 1e500;
TESTCASE( isnan( ld ) == 0 );
ld = 0.0 / 0.0;
TESTCASE( isnan( ld ) == 1 );
return TEST_RESULTS;
}
#endif