令人沮丧的数学题,结果不符合预期

问题描述 投票:0回答:3

这是我的代码,当我运行程序时,油门输出为-18,当我进行数学计算时,我得到77.941......这就是我正在寻找的。我正在 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));

我正在尝试这样做,将数字范围转换为另一个范围,保持比率

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

c++ math arduino linear-programming
3个回答
3
投票

简短的答案是,

(800 - 270) * 100
= 53000。对于为计算结果分配的空间来说,这个数字太大了,整数溢出。

因此更改代码...

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

对此...

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

解决了问题。数字

100
(newMax - newMin)
的值必须是“long”,否则处理器会计算错误。有人,如果需要的话请纠正我,或者如果你有更好的答案,请发布一个更好的答案。另外,如果有人对标题有更好的建议,以便将来遇到相同问题的人可以更容易地找到它,请继续并在下面推荐它。

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


1
投票

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));

0
投票

这可能不是您正在寻找的,但有一个函数可以将值从一个范围更改为另一个范围。

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

例如:

int y = map(10, 0, 50, 0, 100); // y would be 20
© www.soinside.com 2019 - 2024. All rights reserved.