diff options
-rw-r--r-- | MANIFEST | 3 | ||||
-rw-r--r-- | config/commence.in | 2 | ||||
-rw-r--r-- | src/H5Tconv.c | 16 | ||||
-rw-r--r-- | test/dtypes.c | 32 |
4 files changed, 45 insertions, 8 deletions
@@ -238,7 +238,10 @@ ./testpar/Makefile.ascired ./testpar/Makefile.irix64 ./testpar/README +./testpar/t_dset.c +./testpar/t_file.c ./testpar/testphdf5.c +./testpar/testphdf5.h ./tgif/APIGrammar.obj ./tgif/FileGrammar.obj ./tgif/IOPipe.obj diff --git a/config/commence.in b/config/commence.in index 8b33182..72fb45c 100644 --- a/config/commence.in +++ b/config/commence.in @@ -12,7 +12,7 @@ # Programs SHELL=/bin/sh CC=@CC@ -CFLAGS=-D_POSIX_SOURCE @CFLAGS@ +CFLAGS=@CFLAGS@ CPPFLAGS=@CPPFLAGS@ LIBS=@LIBS@ AR=@AR@ diff --git a/src/H5Tconv.c b/src/H5Tconv.c index 930b330..800a9ea 100644 --- a/src/H5Tconv.c +++ b/src/H5Tconv.c @@ -13,6 +13,7 @@ #include <H5Eprivate.h> #include <H5MMprivate.h> #include <H5Tpkg.h> +#include <float.h> /*for FLT_MAX and FLT_MIN */ #include <math.h> /*for ceil() */ /* Conversion data for H5T_conv_struct() */ @@ -1349,8 +1350,19 @@ H5T_conv_double_float (hid_t __unused__ src_id, hid_t __unused__ dst_id, s = (double*)buf; d = (float*)buf; - for (elmtno=0; elmtno<nelmts; elmtno++) { - *d++ = *s++; + /* + * We have to watch out because some machines generate a SIGFPE if + * the source has a larger magnitude than can be represented in the + * destination. + */ + for (elmtno=0; elmtno<nelmts; elmtno++, d++, s++) { + if (*s > FLT_MAX) { + *d = FLT_MAX; + } else if (*s < -FLT_MAX) { + *d = -FLT_MAX; + } else { + *d = *s; + } } break; diff --git a/test/dtypes.c b/test/dtypes.c index 455fd3b..083e73f 100644 --- a/test/dtypes.c +++ b/test/dtypes.c @@ -8,6 +8,7 @@ * Purpose: Tests the data type interface (H5T) */ #include <assert.h> +#include <float.h> #include <hdf5.h> #include <math.h> #include <signal.h> @@ -695,7 +696,7 @@ static int test_conv_flt_1 (const char *name, hid_t src, hid_t dst) { flt_t src_type, dst_type; /*data types */ - const size_t ntests=10; /*number of tests */ + const size_t ntests=5; /*number of tests */ const size_t nelmts=200000; /*num values per test */ const size_t max_fails=8; /*max number of failures*/ size_t fails_all_tests=0; /*number of failures */ @@ -799,7 +800,14 @@ test_conv_flt_1 (const char *name, hid_t src, hid_t dst) } } else if (FLT_DOUBLE==src_type) { if (FLT_FLOAT==dst_type) { - hw_f = ((double*)saved)[j]; + /* Watch out for that FPE on overflow! */ + if (((double*)saved)[j] > FLT_MAX) { + hw_f = FLT_MAX; + } else if (((double*)saved)[j] < -FLT_MAX) { + hw_f = -FLT_MAX; + } else { + hw_f = ((double*)saved)[j]; + } hw = (unsigned char*)&hw_f; } else if (FLT_DOUBLE==dst_type) { hw_d = ((double*)saved)[j]; @@ -810,10 +818,24 @@ test_conv_flt_1 (const char *name, hid_t src, hid_t dst) } } else { if (FLT_FLOAT==dst_type) { - hw_f = ((long double*)saved)[j]; + /* Watch out for that FPE on overflow! */ + if (((long double*)saved)[j] > FLT_MAX) { + hw_f = FLT_MAX; + } else if (((long double*)saved)[j] < -FLT_MAX) { + hw_f = -FLT_MAX; + } else { + hw_f = ((long double*)saved)[j]; + } hw = (unsigned char*)&hw_f; } else if (FLT_DOUBLE==dst_type) { - hw_d = ((long double*)saved)[j]; + /* Watch out for that FPE! */ + if (((long double*)saved)[j] > DBL_MAX) { + hw_d = DBL_MAX; + } else if (((long double*)saved)[j] < -DBL_MAX) { + hw_d = -DBL_MAX; + } else { + hw_d = ((long double*)saved)[j]; + } hw = (unsigned char*)&hw_d; } else { hw_ld = ((long double*)saved)[j]; @@ -993,7 +1015,7 @@ main(void) nerrors += test_named ()<0 ? 1 : 0; nerrors += test_conv_int ()<0 ? 1 : 0; -#ifndef LATER +#ifdef LATER /* * NOT READY FOR TESTING YET BECAUSE SOME SYSTEMS GENERATE A SIGFPE WHEN * AN OVERFLOW OCCURS CASTING A DOUBLE TO A FLOAT. |