我得到的速度值比我计算的值小 4 倍,并将其缩小到车轮半径倒数的除法。我最初有 WHEEL_D_OVER_TWO
并且在做倒数时我得到了一个错误的答案(相差 4 倍)。我已在下面的代码中复制了该问题。
硬件是 Arduino UNO。
#define WHEEL_RADIUS 30.0
#define WHEEL_D_OVER_TWO 60.0 / 2.0
void setup() { Serial.begin(115200); }
void loop() {
Serial.println("WHEEL_RADIUS : " + String(WHEEL_RADIUS, 8));
Serial.println("Inverse WHEEL_RADIUS : " + String(1.000 / WHEEL_RADIUS, 8));
Serial.println("WHEEL_D_OVER_TWO : " + String(WHEEL_D_OVER_TWO, 8));
Serial.println("Inverse WHEEL_D_OVER_TWO : " +
String(1.000 / WHEEL_D_OVER_TWO, 8));
delay(1000);
}
以上代码的输出为
WHEEL_RADIUS : 30.00000000
Inverse WHEEL_RADIUS : 0.03333334
WHEEL_D_OVER_TWO : 30.00000000
Inverse WHEEL_D_OVER_TWO : 0.00833333
逆 WHEEL_RADIUS
使用计算器是正确的。我搜索的大多数问题都是整数除法,我想我在这里避免了。我知道当前的解决方法,但我想知道这个示例中我从根本上缺少什么,这给了我不同的答案。
提前致谢。
最佳答案
宏只是文本替换。您的 WHEEL_D_OVER_TWO
定义为
#define WHEEL_D_OVER_TWO 60.0 / 2.0
这意味着
1.000 / WHEEL_D_OVER_TWO
扩展为
1.000 / 60.0 / 2.0
由于 C 和 C++ 中的 /
运算符从左到右关联,因此这被解释为
(1.000 / 60.0) / 2.0
显然,这与
完全不同
1.000 / WHEEL_RADIUS
(这显然是你所期望的)。
这就是为什么当您将宏定义为表达式时,记住将它们放在括号中
#define WHEEL_D_OVER_TWO (60.0 / 2.0)
这将使您免遭此类意外。
一个更好的想法(至少在 C++ 中)是使用 const 变量而不是宏,并完全忘记这个问题
const double WHEEL_D_OVER_TWO = 60.0 / 2.0;
关于arduino - 为什么 #define 中的除法会导致代码中的除法输出不同的答案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59185744/