Messages in this thread | | | Date | Thu, 30 Aug 2012 16:15:32 -0700 | From | Andrew Morton <> | Subject | Re: [PATCH v2 1/2] linux/kernel.h: Introduce IDIV_ROUND_CLOSEST |
| |
On Tue, 28 Aug 2012 09:30:55 -0700 Guenter Roeck <linux@roeck-us.net> wrote:
> DIV_ROUND_CLOSEST returns a bad result for negative dividends: > DIV_ROUND_CLOSEST(-2, 2) = 0 > > Most of the time this does not matter. However, in the hardware monitoring > subsystem, it is sometimes used on integers which can be negative (such as > temperatures). Introduce new macro IDIV_ROUND_CLOSEST which also supports > negative dividends. >
Can't we just fix DIV_ROUND_CLOSEST? That will make it a bit slower but it's not exactly a speed demon right now. And fixing DIV_ROUND_CLOSEST() might just fix other bugs that we don't know about yet.
Also, the name IDIV_ROUND_CLOSEST doesn't communicate much at all.
> +#define IDIV_ROUND_CLOSEST(x, divisor)( \ > +{ \ > + typeof(x) __x = x; \ > + typeof(divisor) __d = divisor; \ > + (((typeof(x))-1) >= 0 || (__x) >= 0) ? \ > + DIV_ROUND_CLOSEST((__x), (__d)) : \ > + (((__x) - ((__d) / 2)) / (__d)); \ > +} \ > +)
And it doesn't help that the new "function" is undocumented. Yes, we screwed up with DIV_ROUND_CLOSEST(), but that doesn't mean we need to keep screwing up!
| |