令人沮丧的数学问题,结果不如预期 (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));
这是我的代码,当我 运行 程序时油门出现 -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));