forked from mirrors/linux
		
	linux/kernel.h: Fix DIV_ROUND_CLOSEST to support negative dividends
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, DIV_ROUND_CLOSEST is sometimes used on integers which can be negative (such as temperatures). Signed-off-by: Guenter Roeck <linux@roeck-us.net> Acked-by: Jean Delvare <khali@linux-fr.org>
This commit is contained in:
		
							parent
							
								
									4cbe5a555f
								
							
						
					
					
						commit
						b6d86d3d6d
					
				
					 1 changed files with 10 additions and 2 deletions
				
			
		| 
						 | 
					@ -82,10 +82,18 @@
 | 
				
			||||||
	__x - (__x % (y));				\
 | 
						__x - (__x % (y));				\
 | 
				
			||||||
}							\
 | 
					}							\
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Divide positive or negative dividend by positive divisor and round
 | 
				
			||||||
 | 
					 * to closest integer. Result is undefined for negative divisors.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
#define DIV_ROUND_CLOSEST(x, divisor)(			\
 | 
					#define DIV_ROUND_CLOSEST(x, divisor)(			\
 | 
				
			||||||
{							\
 | 
					{							\
 | 
				
			||||||
	typeof(divisor) __divisor = divisor;		\
 | 
						typeof(x) __x = x;				\
 | 
				
			||||||
	(((x) + ((__divisor) / 2)) / (__divisor));	\
 | 
						typeof(divisor) __d = divisor;			\
 | 
				
			||||||
 | 
						(((typeof(x))-1) >= 0 || (__x) >= 0) ?		\
 | 
				
			||||||
 | 
							(((__x) + ((__d) / 2)) / (__d)) :	\
 | 
				
			||||||
 | 
							(((__x) - ((__d) / 2)) / (__d));	\
 | 
				
			||||||
}							\
 | 
					}							\
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue