diff --git a/dda_maths.c b/dda_maths.c index 1c6d8db..e5ea5b2 100644 --- a/dda_maths.c +++ b/dda_maths.c @@ -25,13 +25,19 @@ Found on http://stackoverflow.com/questions/4144232/ how-to-calculate-a-times-b-divided-by-c-only-using-32-bit-integer-types-even-i */ -const uint32_t muldiv(uint32_t multiplicand, uint32_t multiplier, - uint32_t divisor) { +const int32_t muldiv(int32_t multiplicand, uint32_t multiplier, + uint32_t divisor) { uint32_t quotient = 0; uint32_t remainder = 0; + uint8_t negative_flag = 0; uint32_t qn = multiplier / divisor; uint32_t rn = multiplier % divisor; + if (multiplicand < 0) { + negative_flag = 1; + multiplicand = -multiplicand; + } + while(multiplicand) { if (multiplicand & 1) { quotient += qn; @@ -55,6 +61,6 @@ const uint32_t muldiv(uint32_t multiplicand, uint32_t multiplier, quotient++; // remainder is valid here, but not returned - return quotient; + return negative_flag ? -((int32_t)quotient) : (int32_t)quotient; } diff --git a/dda_maths.h b/dda_maths.h index 9efcf7a..a47d6e1 100644 --- a/dda_maths.h +++ b/dda_maths.h @@ -5,7 +5,7 @@ // return rounded result of multiplicand * multiplier / divisor -const uint32_t muldiv(uint32_t multiplicand, uint32_t multiplier, - uint32_t divisor); +const int32_t muldiv(int32_t multiplicand, uint32_t multiplier, + uint32_t divisor); #endif /* _DDA_MATHS_H */