diff options
author | Raymond Lu <songyulu@hdfgroup.org> | 2005-01-06 18:17:59 (GMT) |
---|---|---|
committer | Raymond Lu <songyulu@hdfgroup.org> | 2005-01-06 18:17:59 (GMT) |
commit | 82f6a72ec92fa12371c386c70c607dd8957ce8b6 (patch) | |
tree | 41e4cf0b57c5a123ded9dbe4c3f951b4ae818f4a /src | |
parent | 03edfaa6e90c150e017b2e8d6a6c0772b2a2650c (diff) | |
download | hdf5-82f6a72ec92fa12371c386c70c607dd8957ce8b6.zip hdf5-82f6a72ec92fa12371c386c70c607dd8957ce8b6.tar.gz hdf5-82f6a72ec92fa12371c386c70c607dd8957ce8b6.tar.bz2 |
[svn-r9755] Purpose: New feature
Description: Start to support software conversion between long double and
all integers.
Solution: No major changes to the algorithm. Changes to configure is to
exclude SGI for long double to integers test because there're too many problems
in their compiler.
Platforms tested: h5committest, modi4, fuss, Teragrid, arabica
Misc. update: RELEASE.txt
Diffstat (limited to 'src')
-rw-r--r-- | src/H5Tconv.c | 54 | ||||
-rw-r--r-- | src/H5config.h.in | 4 |
2 files changed, 29 insertions, 29 deletions
diff --git a/src/H5Tconv.c b/src/H5Tconv.c index a9c463f..df87a2d 100644 --- a/src/H5Tconv.c +++ b/src/H5Tconv.c @@ -8914,10 +8914,7 @@ H5T_conv_f_i (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata, size_t nelmts, * the source exponent bias. */ if (0==expo || H5T_NORM_NONE==src.u.f.norm) { - bitno = H5T_bit_find(s, src.u.f.mpos, src.u.f.msize, - H5T_BIT_MSB, TRUE); - assert(bitno>=0); - expo -= (src.u.f.ebias-1) + (src.u.f.msize-bitno); + expo -= (src.u.f.ebias-1); } else if (H5T_NORM_IMPLIED==src.u.f.norm) { expo -= src.u.f.ebias; } else { @@ -8948,7 +8945,7 @@ H5T_conv_f_i (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata, size_t nelmts, * Shift mantissa part by exponent minus mantissa size(right shift), * or by mantissa size minus exponent(left shift). Example: Sequence * 10...010111, expo=20, expo-msize=-3. Right-shift the sequence, we get - * 00010...01. The last three ones were dropped. + * 00010...10. The last three bits were dropped. */ H5T_bit_shift(int_buf, (ssize_t)(expo-src.u.f.msize), 0, buf_size*8); @@ -8959,17 +8956,10 @@ H5T_conv_f_i (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata, size_t nelmts, if (expo < src.u.f.msize && cb_struct.func) truncated = TRUE; - /* Convert to integer representation if negative. - * equivalent to ~(value - 1). - */ - if(sign) { - H5T_bit_dec(int_buf, 0, 8*buf_size); - H5T_bit_neg(int_buf, 0, 8*buf_size); - } - /* * What is the bit position for the most significant bit(MSB) of S - * which is set? + * which is set? This is checked before converted to negative + * integer. */ sfirst = H5T_bit_find(int_buf, 0, 8*buf_size, H5T_BIT_MSB, TRUE); first = (size_t)sfirst; @@ -9041,9 +9031,13 @@ H5T_conv_f_i (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata, size_t nelmts, src_id, dst_id, src_rev, d, cb_struct.user_data); } - if(except_ret == H5T_CONV_UNHANDLED) { - /*copy source value into it if case is ignored by user handler*/ - H5T_bit_copy (d, dst.offset, int_buf, 0, first+1); + if(except_ret == H5T_CONV_UNHANDLED) { /*If this case ignored by user handler*/ + /*Convert to integer representation. Equivalent to ~(value - 1).*/ + H5T_bit_dec(int_buf, 0, 8*buf_size); + H5T_bit_neg(int_buf, 0, 8*buf_size); + + /*copy source value into destiny*/ + H5T_bit_copy (d, dst.offset, int_buf, 0, dst.prec-1); H5T_bit_set (d, (dst.offset + dst.prec-1), 1, TRUE); } else if(except_ret == H5T_CONV_ABORT) HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception") @@ -9055,7 +9049,8 @@ H5T_conv_f_i (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata, size_t nelmts, * the sign bit because 0x80...00 is the biggest negative value. */ if(cb_struct.func) { /*If user's exception handler is present, use it*/ - H5T_reverse_order(src_rev, s, src_p->shared->size, src_p->shared->u.atomic.order); /*reverse order first*/ + /*reverse order first*/ + H5T_reverse_order(src_rev, s, src_p->shared->size, src_p->shared->u.atomic.order); except_ret = (cb_struct.func)(H5T_CONV_EXCEPT_RANGE_LOW, src_id, dst_id, src_rev, d, cb_struct.user_data); } @@ -9072,7 +9067,8 @@ H5T_conv_f_i (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata, size_t nelmts, if (first >= dst.prec-1) { /*overflow*/ if(cb_struct.func) { /*If user's exception handler is present, use it*/ - H5T_reverse_order(src_rev, s, src_p->shared->size, src_p->shared->u.atomic.order); /*reverse order first*/ + /*reverse order first*/ + H5T_reverse_order(src_rev, s, src_p->shared->size, src_p->shared->u.atomic.order); except_ret = (cb_struct.func)(H5T_CONV_EXCEPT_RANGE_HI, src_id, dst_id, src_rev, d, cb_struct.user_data); } @@ -9086,7 +9082,8 @@ H5T_conv_f_i (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata, size_t nelmts, reverse = FALSE; } else if(first < dst.prec-1) { if(truncated && cb_struct.func) { /*If user's exception handler is present, use it*/ - H5T_reverse_order(src_rev, s, src_p->shared->size, src_p->shared->u.atomic.order); /*reverse order first*/ + /*reverse order first*/ + H5T_reverse_order(src_rev, s, src_p->shared->size, src_p->shared->u.atomic.order); except_ret = (cb_struct.func)(H5T_CONV_EXCEPT_TRUNCATE, src_id, dst_id, src_rev, d, cb_struct.user_data); } @@ -9396,11 +9393,10 @@ H5T_conv_i_f (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata, size_t nelmts, /* * Calculate the true destination exponent by adjusting according to - * the destination exponent bias. + * the destination exponent bias. Implied and non-implied normalization + * should be the same. */ - if (H5T_NORM_NONE==src.u.f.norm) { - expo = first + 1 + dst.u.f.ebias; - } else if (H5T_NORM_IMPLIED==src.u.f.norm) { + if (H5T_NORM_NONE==dst.u.f.norm || H5T_NORM_IMPLIED==dst.u.f.norm) { expo = first + dst.u.f.ebias; } else { assert("normalization method not implemented yet" && 0); @@ -9408,10 +9404,10 @@ H5T_conv_i_f (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata, size_t nelmts, } /* Handle mantissa part here */ - if (H5T_NORM_IMPLIED==src.u.f.norm) { + if (H5T_NORM_IMPLIED==dst.u.f.norm) { /* Imply first bit */ H5T_bit_set(int_buf, first, 1, 0); - } else if (H5T_NORM_NONE==src.u.f.norm) { + } else if (H5T_NORM_NONE==dst.u.f.norm) { first++; } @@ -9461,13 +9457,13 @@ H5T_conv_i_f (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata, size_t nelmts, * last f, we get 0x100...000. Treat this special case here. */ if(H5T_bit_get_d(int_buf, dst.u.f.msize, 1)) { - if (H5T_NORM_IMPLIED==src.u.f.norm) { + if (H5T_NORM_IMPLIED==dst.u.f.norm) { /* The bit at this 1's position was impled already, so this * number should be 0x200...000. We need to increment the * exponent in this case. */ expo++; - } else if (H5T_NORM_NONE==src.u.f.norm) { + } else if (H5T_NORM_NONE==dst.u.f.norm) { /* Right shift 1 bit to let the carried 1 fit in the mantissa, * and increment exponent by 1. */ @@ -9479,7 +9475,7 @@ H5T_conv_i_f (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata, size_t nelmts, } else { /* The bit sequence can fit mantissa part. Left shift to fit in from high-order of * bit position. */ - H5T_bit_shift(int_buf, (ssize_t)(dst.u.f.msize-first), 0, buf_size*8); + H5T_bit_shift(int_buf, (ssize_t)(dst.u.f.msize-first), 0, dst.u.f.msize); } diff --git a/src/H5config.h.in b/src/H5config.h.in index 4d95197..95e244d 100644 --- a/src/H5config.h.in +++ b/src/H5config.h.in @@ -516,6 +516,10 @@ /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS +/* Define if your system can accurately convert between long double and + integer values. */ +#undef SW_LDOUBLE_TO_INT_WORKS + /* Define if your system can accurately convert unsigned long long values to floating-point values. */ #undef SW_ULONG_TO_FP_BOTTOM_BIT_WORKS |