From 0214e426a6cd2c80671bb55257e3358e737f60d3 Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Mon, 6 Mar 2017 16:35:30 +0100 Subject: add amount division API and test case --- src/util/amount.c | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) (limited to 'src/util/amount.c') diff --git a/src/util/amount.c b/src/util/amount.c index 407232a9e..7684ddf32 100644 --- a/src/util/amount.c +++ b/src/util/amount.c @@ -565,4 +565,32 @@ TALER_amount_to_string (const struct TALER_Amount *amount) } +/** + * Divide an amount by a float. Note that this function + * may introduce a rounding error! + * + * @param result where to store @a dividend / @a divisor + * @param dividend amount to divide + * @param divisor by what to divide, must be positive + */ +void +TALER_amount_divide (struct TALER_Amount *result, + const struct TALER_Amount *dividend, + uint32_t divisor) +{ + uint64_t modr; + + GNUNET_assert (0 != divisor); + *result = *dividend; + if (1 == divisor) + return; + modr = result->value % divisor; + result->value /= divisor; + /* modr is a 32-bit value, so we can safely multiply by (<32-bit) base and add fraction! */ + modr = (modr * TALER_AMOUNT_FRAC_BASE) + result->fraction; + GNUNET_assert (modr < TALER_AMOUNT_FRAC_BASE * divisor); + result->fraction = (uint32_t) (modr / divisor); +} + + /* end of amount.c */ -- cgit v1.2.3