Use std::abs for a float-compatible abs() function (#2738)
* Other Arduino cores uses a macro to redefine libc abs() to take any type, meaning abs(-3.3) == 3.3 not the normal libc result of 3. * 1e4bf14a3 (#1783) replaced similar min, max macros with c++ stdlib. However this change includes <algorithm> after the line which defines the abs() macro. <algorithm> includes <cstdlib> which undefines abs() and re-defines it. * This means abs() becomes the plain libc version again which only takes integers, so abs(-3.3) == 3. As reported here: https://github.com/espressif/esp-idf/issues/3405 This fix tries to keep in the spirit of #1783 by using libstdc++. The other option would be to include <cstdlib> before defining the abs() macro, so it doesn't get undef-ed again later on.
This commit is contained in:
		
							parent
							
								
									bd57ff4ab4
								
							
						
					
					
						commit
						2f249edb8e
					
				| @ -68,12 +68,6 @@ | ||||
| #define __STRINGIFY(a) #a | ||||
| #endif | ||||
| 
 | ||||
| // undefine stdlib's abs if encountered
 | ||||
| #ifdef abs | ||||
| #undef abs | ||||
| #endif | ||||
| 
 | ||||
| #define abs(x) ((x)>0?(x):-(x)) | ||||
| #define constrain(amt,low,high) ((amt)<(low)?(low):((amt)>(high)?(high):(amt))) | ||||
| #define radians(deg) ((deg)*DEG_TO_RAD) | ||||
| #define degrees(rad) ((rad)*RAD_TO_DEG) | ||||
| @ -160,6 +154,7 @@ void shiftOut(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder, uint8_t val); | ||||
| #include "HardwareSerial.h" | ||||
| #include "Esp.h" | ||||
| 
 | ||||
| using std::abs; | ||||
| using std::isinf; | ||||
| using std::isnan; | ||||
| using std::max; | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user