gcode_parse.c: replace some ints by uints to double the range.

This is without accuracy or other losses and should finally make
decfloat_to_int() free of variable overflow within the decribed
ranges. Surprisingly, this costs 14 bytes program size.
This commit is contained in:
Markus Hitter 2011-02-23 14:37:56 +01:00
parent 694e3c4298
commit bdeb4827fc
1 changed files with 5 additions and 5 deletions

View File

@ -74,28 +74,28 @@ extern const uint32_t powers[]; // defined in sermsg.c
const int32_t rounding[DECFLOAT_EXP_MAX] = {0, 5, 50, 500};
static int32_t decfloat_to_int(decfloat *df, uint32_t multiplicand, uint32_t denominator) {
int32_t r = df->mantissa;
uint32_t r = df->mantissa;
uint8_t e = df->exponent;
// e=1 means we've seen a decimal point but no digits after it, and e=2 means we've seen a decimal point with one digit so it's too high by one if not zero
if (e)
e--;
int32_t rnew1 = r * (multiplicand / denominator);
uint32_t rnew1 = r * (multiplicand / denominator);
if (e)
{
int32_t rnew2 = r * (multiplicand % denominator) / denominator;
uint32_t rnew2 = r * (multiplicand % denominator) / denominator;
r = rnew1 + rnew2;
r = (r + rounding[e]) / powers[e];
}
else
{
int32_t rnew2 = (r * (multiplicand % denominator) + (denominator / 2)) / denominator;
uint32_t rnew2 = (r * (multiplicand % denominator) + (denominator / 2)) / denominator;
r = rnew1 + rnew2;
}
return df->sign ? -r : r;
return df->sign ? -(int32_t)r : (int32_t)r;
}
/****************************************************************************