arduino - 为什么 #define 中的除法会导致代码中的除法输出不同的答案

标签 arduino

我得到的速度值比我计算的值小 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/

相关文章:

c++ - 我有以字节为单位的串行数据流。读取数据的最简单方法是什么?

Node.js SerialPort Arduino 时序问题

c - 在UART接口(interface)初始化MFRC522 RFID芯片

python - 仅当树莓派要求时才在 Arduino 上运行 C++

java - 通过串口监视器和Java同时读取Arduino

c - Arduino:将十六进制字符串转换为 uint64 或十进制字符串

c++ - Arduino/C++ : Access specific header file of structs from library

powershell - Arduino 通过 PowerShell 脚本与 PC 通信

c - jmp 到内联 AVR C 中的地址

java - 如何在不使用鼠标的情况下为 Facebook 粉丝专页上的页面点赞