124 lines
2.3 KiB
C
124 lines
2.3 KiB
C
|
|
/* 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
|