* value is represented as a pseudo-struct char array, addressed
* by macros
* struct {
- * char sign; // 0 for positive, 1 for negative
+ * char sign; // 0 for positive, 1 for negative
* char exp[VALUE_SIZE];
* char mant[VALUE_SIZE];
* descriptor_t desc;
* when exponents are equal is required though.
* Also special care about the sign is needed when the mantissas are equal
* (+/- 0 ?) */
- if (sign && sc_val_to_long(exp_diff) == 0) {
+ if (sign && sc_val_to_long(exp_diff, VALUE_SIZE >> 2, 1) == 0) {
switch (sc_comp(_mant(a), _mant(b))) {
case 1: /* a > b */
if (_sign(a)) _sign(result) = 1; /* abs(a) is bigger and a is negative */
memcpy(&_desc(result), &_desc(a), sizeof(descriptor_t));
exp_bias = (1<<_desc(a).exponent_size)/2-1;
- exp_val = sc_val_to_long(_exp(a)) - exp_bias;
+ exp_val = sc_val_to_long(_exp(a), VALUE_SIZE >> 2, 1) - exp_bias;
if (exp_val < 0) {
sc_val_from_ulong(0, NULL);
_fail_char(old_str, len, str - old_str);
}
}
- } // switch(state)
+ } /* switch(state) */
done:
sc_val_from_str(mant_str, strlen(mant_str), _mant(result));
#endif
#ifdef HAVE_LONG_DOUBLE
- TRACEPRINTF(("val_from_float(%.8X%.8X%.8X)\n", ((int*)&l)[2], ((int*)&l)[1], ((int*)&l)[0]));//srcval.val.high, srcval.val.mid, srcval.val.low));
+ TRACEPRINTF(("val_from_float(%.8X%.8X%.8X)\n", ((int*)&l)[2], ((int*)&l)[1], ((int*)&l)[0]));/* srcval.val.high, srcval.val.mid, srcval.val.low)); */
DEBUGPRINTF(("(%d-%.4X-%.8X%.8X)\n", sign, exponent, mantissa0, mantissa1));
#else
TRACEPRINTF(("val_from_float(%.8X%.8X)\n", srcval.val.high, srcval.val.low));
/* @@@ long double exponent is 15bit, so the use of sc_val_to_long should not
* lead to wrong results */
- exponent = sc_val_to_long(_exp(value)) ;
+ exponent = sc_val_to_long(_exp(value), VALUE_SIZE >> 2, 1) ;
sc_val_from_ulong(2, NULL);
_shift_right(_mant(value), sc_get_buffer(), _mant(value));
}
}
+void finish_fltcalc (void) {
+ free(calc_buffer); calc_buffer = NULL;
+}
+
/* definition of interface functions */
FC_DEFINE2(add)
FC_DEFINE2(sub)