令人沮丧的数学问题,结果不如预期 (EDQ)

Frustrating Math Problem, results not as expected (EDQ)

这是我的代码,当我 运行 程序时油门出现 -18,当我计算时我得到 77.941... 这就是我要找的。我知道这是一个 EDQ“极其愚蠢的问题”,而且我很可能在任何时候都会遇到 FIF,“前额拳头”的时刻,但我现在坚持下去。仅供参考,在 Windows 10.

上使用 Arduino IDE 在 Atmega 328P 上编程

以下示例打印 -18,根据我的计算,它应该是 77.941...

  int throttle = (((800 - 270) * 100) / 680);
  Serial.println(throttle);

这是可视化代码...

  throttle = (((throttleSensor - oldMinValue) * (newMax - newMin)) / (oldMax - oldMin));

我正在尝试这样做,Convert a number range to another range, maintaining ratio

此外,我应该补充一点,当结果低于 47 时它工作正常,高于它时它翻转为负数。

简短的回答是,(800 - 270) * 100 = 53000。这对于分配给计算结果的 space 来说太大了,整数溢出。

所以从这里更改代码...

 int throttle = (((800 - 270) * 100) / 680);

对此...

long largeValue = 100;
int throttle = (((800 - 270) * largeValue) / 680);

修复了问题。数字 100(newMax - newMin) 的值必须是“long”,否则处理器会计算错误。有人,如果需要的话请纠正我,或者 post 如果你有一个更好的答案。另外,如果有人对标题有更好的建议,方便以后有同样问题的人找到,欢迎在下方点赞。

感谢 Whosebug 社区帮助我解决了这个问题!

这可能不是您要查找的内容,但有一个函数可以将值从一个范围更改为另一个范围。

int y = map(value, minOld, maxOld, minNew, maxNew);

例如:

int y = map(10, 0, 50, 0, 100); // y would be 20

as @edgar_wideman 答案表明您的子结果 (53000) 不适合 16 位整数 <-32768,+32767>。您可以像这样通过移位(除以 2 的幂)来避免使用 long

int sh=1; // shift stuff so it fits 16 bit
int throttle = (((800 - 270) * (100>>sh)) / (680>>sh));