/* 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 #ifndef REGTEST #include "pdclib/_PDCLIB_print.h" #include 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