Introduce muldivQR().

This is a version of muldiv() with qn and rn precalculated,
so it can be avoided to re-calclulate it on every instance.

Yet another 116 bytes, unfortunately.
This commit is contained in:
Markus Hitter 2012-06-27 00:43:33 +02:00
parent 0068ed1e26
commit 44be918d2a
2 changed files with 19 additions and 12 deletions

View File

@ -9,10 +9,11 @@
#include <stdint.h>
/*!
Integer multiply-divide algorithm.
Integer multiply-divide algorithm. Returns the same as muldiv(multiplicand, multiplier, divisor), but also allowing to use precalculated quotients and remainders.
\param multiplicand
\param multiplier
\param qn ( = multiplier / divisor )
\param rn ( = multiplier % divisor )
\param divisor
\return rounded result of multiplicand * multiplier / divisor
@ -25,13 +26,11 @@
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 int32_t muldiv(int32_t multiplicand, uint32_t multiplier,
uint32_t divisor) {
const int32_t muldivQR(int32_t multiplicand, uint32_t qn, uint32_t rn,
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;

View File

@ -6,13 +6,21 @@
#include "config.h"
// return rounded result of multiplicand * multiplier / divisor
const int32_t muldiv(int32_t multiplicand, uint32_t multiplier,
uint32_t divisor);
#define muldiv(multiplicand, multiplier, divisor) \
muldivQR(multiplicand, multiplier / divisor, multiplier % divisor, divisor)
// same as before, but with quotient and remainder precalculated elsewhere
const int32_t muldivQR(int32_t multiplicand, uint32_t qn, uint32_t rn,
uint32_t divisor);
// convert micrometer distances to motor step distances
#define um_to_steps_x(distance) muldiv(distance, STEPS_PER_M_X, 1000000UL);
#define um_to_steps_y(distance) muldiv(distance, STEPS_PER_M_Y, 1000000UL);
#define um_to_steps_z(distance) muldiv(distance, STEPS_PER_M_Z, 1000000UL);
#define um_to_steps_e(distance) muldiv(distance, STEPS_PER_M_E, 1000000UL);
#define um_to_steps_x(distance) muldivQR(distance, \
STEPS_PER_M_X / 1000000UL, STEPS_PER_M_X % 1000000UL, 1000000UL);
#define um_to_steps_y(distance) muldivQR(distance, \
STEPS_PER_M_Y / 1000000UL, STEPS_PER_M_Y % 1000000UL, 1000000UL);
#define um_to_steps_z(distance) muldivQR(distance, \
STEPS_PER_M_Z / 1000000UL, STEPS_PER_M_Z % 1000000UL, 1000000UL);
#define um_to_steps_e(distance) muldivQR(distance, \
STEPS_PER_M_E / 1000000UL, STEPS_PER_M_E % 1000000UL, 1000000UL);
#endif /* _DDA_MATHS_H */