#define _shift_right(x, y, res) sc_shr((x), (y), value_size*4, 0, (res))
#define _shift_left(x, y, res) sc_shl((x), (y), value_size*4, 0, (res))
-
-#ifdef FLTCALC_DEBUG
-# define DEBUGPRINTF(x) printf x
-#else
-# define DEBUGPRINTF(x) ((void)0)
-#endif
-
-#ifdef FLTCALC_TRACE_CALC
-# define TRACEPRINTF(x) printf x
-#else
-# define TRACEPRINTF(x) ((void)0)
-#endif
-
/** A temporal buffer. */
static fp_value *calc_buffer = NULL;
/* check for exponent underflow */
if (sc_is_negative(_exp(out_val)) || sc_is_zero(_exp(out_val))) {
- DEBUGPRINTF(("Exponent underflow!\n"));
/* exponent underflow */
/* shift the mantissa right to have a zero exponent */
sc_val_from_ulong(1, temp);
round_dir = 0;
break;
}
- DEBUGPRINTF(("Rounding (s%d, l%d, g%d, r%d, s%d) %s\n", out_val->sign, lsb>>2, guard, round, sticky, (round_dir)?"up":"down"));
if (round_dir == 1) {
guard = (round^guard)<<1;
/* check for exponent overflow */
sc_val_from_ulong((1 << out_val->desc.exponent_size) - 1, temp);
if (sc_comp(_exp(out_val), temp) != -1) {
- DEBUGPRINTF(("Exponent overflow!\n"));
/* exponent overflow, reaction depends on rounding method:
*
* mode | sign of value | result
buffer[len] = '\0';
val = string_to_long_double(buffer);
- DEBUGPRINTF(("val_from_str(%s)\n", str));
tmp_desc.exponent_size = 15;
tmp_desc.mantissa_size = 63;
tmp_desc.explicit_one = 1;
* encoding is needed. the function can return immediately in these cases */
if (my_isnan(l)) {
result->clss = FC_NAN;
- TRACEPRINTF(("val_from_float resulted in NAN\n"));
return result;
} else if (my_isinf(l)) {
result->clss = FC_INF;
- TRACEPRINTF(("val_from_float resulted in %sINF\n", (result->sign == 1) ? "-" : ""));
return result;
}
normalize(result, result, 0);
- TRACEPRINTF(("val_from_float results in %s\n", fc_print(result, temp, calc_buffer_size, FC_PACKED)));
-
return result;
}
buildval.val_ld12.low = mantissa1;
}
- TRACEPRINTF(("val_to_float: %d-%x-%x%x\n", sign, exponent, mantissa0, mantissa1));
return buildval.d;
}
}
normalize(result, result, 0);
- TRACEPRINTF(("Cast results in %s\n", fc_print(result, temp, value_size, FC_PACKED)));
return result;
}
calc_buffer = (fp_value*) xmalloc(calc_buffer_size);
memset(calc_buffer, 0, calc_buffer_size);
- DEBUGPRINTF(("init fltcalc:\n\tVALUE_SIZE = %d\ntCALC_BUFFER_SIZE = %d\n\tcalc_buffer = %p\n\n", value_size, calc_buffer_size, calc_buffer));
}
}
free(calc_buffer); calc_buffer = NULL;
}
-#ifdef FLTCALC_TRACE_CALC
-static char buffer[100];
-#endif
-
/* definition of interface functions */
fp_value *fc_add(const fp_value *a, const fp_value *b, fp_value *result)
{
if (result == NULL) result = calc_buffer;
- TRACEPRINTF(("%s ", fc_print(a, buffer, sizeof(buffer), FC_PACKED)));
- TRACEPRINTF(("+ %s ", fc_print(b, buffer, sizeof(buffer), FC_PACKED)));
-
/* make the value with the bigger exponent the first one */
if (sc_comp(_exp(a), _exp(b)) == -1)
_fadd(b, a, result);
else
_fadd(a, b, result);
- TRACEPRINTF(("= %s\n", fc_print(result, buffer, sizeof(buffer), FC_PACKED)));
return result;
}
if (result == NULL) result = calc_buffer;
- TRACEPRINTF(("%s ", fc_print(a, buffer, sizeof(buffer), FC_PACKED)));
- TRACEPRINTF(("- %s ", fc_print(b, buffer, sizeof(buffer), FC_PACKED)));
-
temp = (fp_value*) alloca(calc_buffer_size);
memcpy(temp, b, calc_buffer_size);
temp->sign = !b->sign;
else
_fadd(a, temp, result);
- TRACEPRINTF(("= %s\n", fc_print(result, buffer, sizeof(buffer), FC_PACKED)));
return result;
}
{
if (result == NULL) result = calc_buffer;
- TRACEPRINTF(("%s ", fc_print(a, buffer, sizeof(buffer), FC_PACKED)));
- TRACEPRINTF(("* %s ", fc_print(b, buffer, sizeof(buffer), FC_PACKED)));
-
_fmul(a, b, result);
- TRACEPRINTF(("= %s\n", fc_print(result, buffer, sizeof(buffer), FC_PACKED)));
return result;
}
{
if (result == NULL) result = calc_buffer;
- TRACEPRINTF(("%s ", fc_print(a, buffer, sizeof(buffer), FC_PACKED)));
- TRACEPRINTF(("/ %s ", fc_print(b, buffer, sizeof(buffer), FC_PACKED)));
-
_fdiv(a, b, result);
- TRACEPRINTF(("= %s\n", fc_print(result, buffer, sizeof(buffer), FC_PACKED)));
return result;
}
{
if (result == NULL) result = calc_buffer;
- TRACEPRINTF(("- %s ", fc_print(a, buffer, sizeof(buffer), FC_PACKED)));
-
if (a != result)
memcpy(result, a, calc_buffer_size);
result->sign = !a->sign;
- TRACEPRINTF(("= %s\n", fc_print(result, buffer, sizeof(buffer), FC_PACKED)));
return result;
}
{
if (result == NULL) result = calc_buffer;
- TRACEPRINTF(("%s ", fc_print(a, buffer, sizeof(buffer), FC_PACKED)));
- TRACEPRINTF(("truncated to integer "));
-
_trunc(a, result);
- TRACEPRINTF(("= %s\n", fc_print(result, buffer, sizeof(buffer), FC_PACKED)));
return result;
}
{
(void)a;
(void)result;
- TRACEPRINTF(("%s ", fc_print(a, buffer, sizeof(buffer), FC_PACKED)));
- TRACEPRINTF(("rounded to integer "));
panic("not yet implemented");
}