| @@ -60,16 +60,23 @@ long map(T _x, A _in_min, B _in_max, C _out_min, D _out_max, typename std::enabl | |||
| return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; | |||
| } | |||
| #endif | |||
| // first compute the ranges and check if input doesn't matter | |||
| long in_range = in_max - in_min; | |||
| long out_range = out_max - out_min; | |||
| if (in_range == 0) return out_min + out_range / 2; | |||
| // compute the numerator | |||
| long num = (x - in_min) * out_range; | |||
| // before dividing, add extra for proper round off (towards zero) | |||
| if (out_range >= 0) { | |||
| num += in_range / 2; | |||
| } else { | |||
| num -= in_range / 2; | |||
| } | |||
| // divide by input range and add output offset to complete map() compute | |||
| long result = num / in_range + out_min; | |||
| // fix "a strange behaviour with negative numbers" (see ArduinoCore-API issue #51) | |||
| // this step can be deleted if you don't care about non-linear output | |||
| // behavior extrapolating slightly beyond the mapped input & output range | |||
| if (out_range >= 0) { | |||
| if (in_range * num < 0) return result - 1; | |||
| } else { | |||