Deleted Added
full compact
2c2
< * Copyright (C) 1984-2009 Mark Nudelman
---
> * Copyright (C) 1984-2011 Mark Nudelman
252a253,274
> /* #define HAVE_FLOAT 0 */
>
> static POSITION
> muldiv(val, num, den)
> POSITION val, num, den;
> {
> #if HAVE_FLOAT
> double v = (((double) val) * num) / den;
> return ((POSITION) (v + 0.5));
> #else
> POSITION v = ((POSITION) val) * num;
>
> if (v / num == val)
> /* No overflow */
> return (POSITION) (v / den);
> else
> /* Above calculation overflows;
> * use a method that is less precise but won't overflow. */
> return (POSITION) (val / (den / num));
> #endif
> }
>
261,266c283
< POSITION num100 = num * 100;
<
< if (num100 / 100 == num)
< return (num100 / den);
< else
< return (num / (den / 100));
---
> return (int) muldiv(num, (POSITION) 100, den);
279,280c296
< long perden = (percent * (NUM_FRAC_DENOM / 100)) + (fraction / 100);
< POSITION temp;
---
> POSITION perden = (percent * (NUM_FRAC_DENOM / 100)) + (fraction / 100);
284,291c300
< temp = pos * perden; /* This might overflow. */
< if (temp / perden == pos)
< /* No overflow */
< return (temp / NUM_FRAC_DENOM);
< else
< /* Above calculation overflows;
< * use a method that is less precise but won't overflow. */
< return (perden * (pos / NUM_FRAC_DENOM));
---
> return (POSITION) muldiv(pos, perden, (POSITION) NUM_FRAC_DENOM);