【问题标题】:Wrong results for round() in Arduino IDE at ATMega328PATMega328P 的 Arduino IDE 中的 round() 结果错误
【发布时间】:2021-05-19 18:41:03
【问题描述】:

使用 round() 时出现意外结果:

#include <Arduino.h>
int main(void) {
  init();
  Serial.begin(9600);
  float a = 1.0;
  float b = round(a);
  Serial.println(b);  // prints "1.50" 
  delay(100);
  return 0;
}

得到期望值1.0的诀窍是什么?

【问题讨论】:

  • 假设这是 C++,你是否包含了声明 round() 和 Serial 的标头?启用对浮点的支持(如果您的操作系统需要)?你能给我们展示一个完整的、最小的程序吗?
  • @Jens 我包含了完整的代码示例
  • main结尾的嵌入式裸机程序return 0??嗯。它不能很好地结束。
  • 请将b 替换为"Hello world" 并查看它正在打印。也许你没有正确编译/刷新代码。
  • @EugeneSh。如果我删除 return 0 或在无限循环中运行代码,它会打印相同的结果......

标签: c arduino-ide atmega32


【解决方案1】:

看来我发现了问题: 该问题是由 Arduino.h 中的 round() 宏引起的:

#define round(x)     ({ typeof (x) _x = (x); _x >= 0 ? (long)_x + 0.5 : (long)_x - 0.5; })

您必须将round() 结果转换为整数类型才能获得预期的浮点数:

float a = 1.0f;
float b = (int16_t) round(a);
Serial.println(b);  // "1.00"

【讨论】:

  • 哇——这太令人困惑了,尤其是因为已经有一个 round() 标准函数。我建议使用float b = roundf(a);。我到了this comment in github issue。如果他们能删除宏,那就太好了——它与标准功能冲突。
  • @KamilCuk 感谢 github 链接,我在那里发表了评论?
  • 这是一个 Arduino 长期争论的问题,对我来说是一个错误。如果你需要真正的round(),在header包含后取消定义宏#undef round,然后包含math.h
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-22
  • 1970-01-01
  • 2017-01-30
  • 2021-08-21
  • 2023-01-23
相关资源
最近更新 更多