Mercurial > hg > octave-nkf
changeset 7991:139f47cf17ab
Change NA value to support single to double precision conversion
author | David Bateman <dbateman@free.fr> |
---|---|
date | Thu, 05 Jun 2008 21:58:14 +0200 |
parents | 86dae6e5b83c |
children | 80e3fe8938f2 |
files | liboctave/ChangeLog liboctave/data-conv.cc liboctave/lo-cieee.c liboctave/lo-ieee.h src/ChangeLog src/data.cc |
diffstat | 6 files changed, 68 insertions(+), 6 deletions(-) [+] |
line wrap: on
line diff
--- a/liboctave/ChangeLog +++ b/liboctave/ChangeLog @@ -1,3 +1,21 @@ +2008-07-29 David Bateman <dbateman@free.fr> + + * lo-ieee.h (LO_IEEE_NA_HW, LO_IEEE_NA_LW, LO_IEEE_NA_FLOAT): + Change definition so cast from single to double and visa versa + maintains NA value. + (LO_IEEE_NA_HW_OLD, LO_IEEE_NA_LW_OLD): Keep old values. + (extern OCTAVE_API int __lo_ieee_is_old_NA (double)): Function to + detect old NA value. + (extern OCTAVE_API double __lo_ieee_replace_old_NA (double)): + Function to replace old NA value with new new. + * lo-cieee.c (int __lo_ieee_is_old_NA (double)): Function to + detect old NA value. + (double __lo_ieee_replace_old_NA (double)): Function to replace + old NA value with new new. + * data-conv.cc (void read_doubles(std::istream&, double *, + save_type, int, bool, octave_mach_info::float_format)): Test if + loaded NA values is the old representation and replace it. + 2008-07-28 Jaroslav Hajek <highegg@gmail.com> * lo-math.h: Ensure log2 is undefined from cmath in C++ mode.
--- a/liboctave/data-conv.cc +++ b/liboctave/data-conv.cc @@ -34,6 +34,7 @@ #include "byte-swap.h" #include "data-conv.h" #include "lo-error.h" +#include "lo-ieee.h" template void swap_bytes<2> (volatile void *, int); template void swap_bytes<4> (volatile void *, int); @@ -1048,8 +1049,13 @@ break; case LS_DOUBLE: // No conversion necessary. - is.read (reinterpret_cast<char *> (data), 8 * len); - do_double_format_conversion (data, len, fmt); + { + is.read (reinterpret_cast<char *> (data), 8 * len); + do_double_format_conversion (data, len, fmt); + + for (int i = 0; i < len; i++) + data[i] = __lo_ieee_replace_old_NA (data[i]); + } break; default:
--- a/liboctave/lo-cieee.c +++ b/liboctave/lo-cieee.c @@ -150,13 +150,36 @@ #if defined (HAVE_ISNAN) lo_ieee_double t; t.value = x; - return (isnan (x) && t.word[lo_ieee_lw] == LO_IEEE_NA_LW) ? 1 : 0; + return (isnan (x) && t.word[lo_ieee_hw] == LO_IEEE_NA_HW + && t.word[lo_ieee_lw] == LO_IEEE_NA_LW) ? 1 : 0; #else return 0; #endif } int +__lo_ieee_is_old_NA (double x) +{ +#if defined (HAVE_ISNAN) + lo_ieee_double t; + t.value = x; + return (isnan (x) && t.word[lo_ieee_lw] == LO_IEEE_NA_LW_OLD + && t.word[lo_ieee_hw] == LO_IEEE_NA_HW_OLD) ? 1 : 0; +#else + return 0; +#endif +} + +double +__lo_ieee_replace_old_NA (double x) +{ + if (__lo_ieee_is_old_NA (x)) + return lo_ieee_na_value (); + else + return x; +} + +int __lo_ieee_is_NaN_or_NA (double x) { return __lo_ieee_isnan (x);
--- a/liboctave/lo-ieee.h +++ b/liboctave/lo-ieee.h @@ -64,9 +64,12 @@ unsigned int word; } lo_ieee_float; -#define LO_IEEE_NA_HW 0x7ff00000 -#define LO_IEEE_NA_LW 1954 -#define LO_IEEE_NA_FLOAT 0x7f8207a2 +#define LO_IEEE_NA_HW_OLD 0x7ff00000 +#define LO_IEEE_NA_LW_OLD 1954 +#define LO_IEEE_NA_HW 0x7FF840F4 +#define LO_IEEE_NA_LW 0x40000000 +#define LO_IEEE_NA_FLOAT 0x7FC207A2 + extern OCTAVE_API void octave_ieee_init (void); @@ -85,7 +88,9 @@ extern OCTAVE_API int __lo_ieee_isinf (double x); extern OCTAVE_API int __lo_ieee_is_NA (double); +extern OCTAVE_API int __lo_ieee_is_old_NA (double); extern OCTAVE_API int __lo_ieee_is_NaN_or_NA (double) GCC_ATTR_DEPRECATED; +extern OCTAVE_API double __lo_ieee_replace_old_NA (double); extern OCTAVE_API double lo_ieee_inf_value (void); extern OCTAVE_API double lo_ieee_na_value (void);