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));				\ | ||||
| }							\ | ||||
| ) | ||||
| 
 | ||||
| /*
 | ||||
|  * 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)(			\ | ||||
| {							\ | ||||
| 	typeof(divisor) __divisor = divisor;		\ | ||||
| 	(((x) + ((__divisor) / 2)) / (__divisor));	\ | ||||
| 	typeof(x) __x = x;				\ | ||||
| 	typeof(divisor) __d = divisor;			\ | ||||
| 	(((typeof(x))-1) >= 0 || (__x) >= 0) ?		\ | ||||
| 		(((__x) + ((__d) / 2)) / (__d)) :	\ | ||||
| 		(((__x) - ((__d) / 2)) / (__d));	\ | ||||
| }							\ | ||||
| ) | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Guenter Roeck
				Guenter Roeck