Mercurial > hg > octave-lyh
diff liboctave/lo-cieee.c @ 7789:82be108cc558
First attempt at single precision tyeps
* * *
corrections to qrupdate single precision routines
* * *
prefer demotion to single over promotion to double
* * *
Add single precision support to log2 function
* * *
Trivial PROJECT file update
* * *
Cache optimized hermitian/transpose methods
* * *
Add tests for tranpose/hermitian and ChangeLog entry for new transpose code
author | David Bateman <dbateman@free.fr> |
---|---|
date | Sun, 27 Apr 2008 22:34:17 +0200 |
parents | 2eb392d058bb |
children | 87865ed7405f |
line wrap: on
line diff
--- a/liboctave/lo-cieee.c +++ b/liboctave/lo-cieee.c @@ -69,12 +69,15 @@ /* Octave's idea of infinity. */ double octave_Inf; +float octave_Float_Inf; /* Octave's idea of a missing value. */ double octave_NA; +float octave_Float_NA; /* Octave's idea of not a number. */ double octave_NaN; +float octave_Float_NaN; int lo_ieee_hw; int lo_ieee_lw; @@ -82,13 +85,25 @@ #if defined (SCO) int -isnan (double x) +__isnan (double x) { return (IsNANorINF (x) && NaN (x) && ! IsINF (x)) ? 1 : 0; } int -isinf (double x) +__isinf (double x) +{ + return (IsNANorINF (x) && IsINF (x)) ? 1 : 0; +} + +int +__isnanf (float x) +{ + return (IsNANorINF (x) && NaN (x) && ! IsINF (x)) ? 1 : 0; +} + +int +__isinff (float x) { return (IsNANorINF (x) && IsINF (x)) ? 1 : 0; } @@ -96,7 +111,7 @@ #endif int -lo_ieee_isnan (double x) +__lo_ieee_isnan (double x) { #if defined (HAVE_ISNAN) return isnan (x); @@ -106,31 +121,31 @@ } int -lo_ieee_finite (double x) +__lo_ieee_finite (double x) { #if defined (HAVE_FINITE) - return finite (x) != 0 && ! lo_ieee_isnan (x); + return finite (x) != 0 && ! __lo_ieee_isnan (x); #elif defined (HAVE_ISINF) - return (! isinf (x) && ! lo_ieee_isnan (x)); + return (! isinf (x) && ! __lo_ieee_isnan (x)); #else - return ! lo_ieee_isnan (x); + return ! __lo_ieee_isnan (x); #endif } int -lo_ieee_isinf (double x) +__lo_ieee_isinf (double x) { #if defined (HAVE_ISINF) return isinf (x); #elif defined (HAVE_FINITE) - return (! (finite (x) || lo_ieee_isnan (x))); + return (! (finite (x) || __lo_ieee_isnan (x))); #else return 0; #endif } int -lo_ieee_is_NA (double x) +__lo_ieee_is_NA (double x) { #if defined (HAVE_ISNAN) lo_ieee_double t; @@ -142,9 +157,9 @@ } int -lo_ieee_is_NaN_or_NA (double x) +__lo_ieee_is_NaN_or_NA (double x) { - return lo_ieee_isnan (x); + return __lo_ieee_isnan (x); } double @@ -170,7 +185,101 @@ #endif int -lo_ieee_signbit (double x) +__lo_ieee_signbit (double x) +{ +/* In the following definitions, only check x < 0 explicitly to avoid + a function call when it looks like signbit or copysign are actually + functions. */ + +#if defined (signbit) + return signbit (x); +#elif defined (HAVE_SIGNBIT) + return (x < 0 || signbit (x)); +#elif defined (copysign) + return (copysign (1.0, x) < 0); +#elif defined (HAVE_COPYSIGN) + return (x < 0 || copysign (1.0, x) < 0); +#else + return x < 0; +#endif +} + +int +__lo_ieee_float_isnan (float x) +{ +#if defined (HAVE_ISNAN) + return isnan (x); +#else + return 0; +#endif +} + +int +__lo_ieee_float_finite (float x) +{ +#if defined (HAVE_FINITE) + return finite (x) != 0 && ! __lo_ieee_float_isnan (x); +#elif defined (HAVE_ISINF) + return (! isinf (x) && ! __lo_ieee_float_isnan (x)); +#else + return ! __lo_ieee_float_isnan (x); +#endif +} + +int +__lo_ieee_float_isinf (float x) +{ +#if defined (HAVE_ISINF) + return isinf (x); +#elif defined (HAVE_FINITE) + return (! (finite (x) || __lo_ieee_float_isnan (x))); +#else + return 0; +#endif +} + +int +__lo_ieee_float_is_NA (float x) +{ +#if defined (HAVE_ISNAN) + lo_ieee_float t; + t.value = x; + return (isnan (x) && (t.word & 0xFFFF) == LO_IEEE_NA_FLOAT_LW) ? 1 : 0; +#else + return 0; +#endif +} + +int +__lo_ieee_float_is_NaN_or_NA (float x) +{ + return __lo_ieee_float_isnan (x); +} + +float +lo_ieee_float_inf_value (void) +{ + return octave_Inf; +} + +float +lo_ieee_float_na_value (void) +{ + return octave_NA; +} + +float +lo_ieee_float_nan_value (void) +{ + return octave_NaN; +} + +#if ! (defined (signbit) || defined (HAVE_DECL_SIGNBIT)) && defined (HAVE_SIGNBIT) +extern int signbit (float); +#endif + +int +__lo_ieee_float_signbit (float x) { /* In the following definitions, only check x < 0 explicitly to avoid a function call when it looks like signbit or copysign are actually