NAN 结果 Arduino Uno [关闭]

Posted

技术标签:

【中文标题】NAN 结果 Arduino Uno [关闭]【英文标题】:NAN result Adruino Uno [closed] 【发布时间】:2021-01-29 16:02:54 【问题描述】:

我正在尝试在 Arduino 中做一些数学运算,结果是 NaN:

int Count1=1;
int Count1=1;
int Count2=2;

float Total= 0;
float n1= Count1;
float n2= Count2;

void setup() 
Serial.begin(9600);


void loop()
 Total = ((n1 / n2)*-100);
 Serial.print(Total);

结果:总计 = Nan。

你能帮我一些提示吗?

【问题讨论】:

【参考方案1】:

很难说你得到了什么编译器(我不在 Arduino 框架中编码)但我看到了这一行的问题:

Total = ((n1 / n2)*-100);

其中n1=1, n2=2floats,但-100 是整数,因此您的编译器很可能将计算转换为整数(1/2 = 0),然后再转换回float,这很慢并四舍五入您想要的结果...有办法解决这个问题

    使用浮点数来避免整数数学

    Total = ((n1 / n2)*-100.0);
    Total = ((n1 / n2)*-100.0f);
    

    先乘以保持准确性

    Total = (-100*n1)/n2;
    

    但是这很可能仍然使用整数,所以小数点后没有数字。

我更喜欢使用 #1,因为您的输出也是 float...

然而,所有这一切都会导致结果0 而不是NAN,因此可能还有不同的问题,例如您的Serial.print(Total); 期望的数据类型是真的float 还是它的double

试试这个:

double x;
x=Total;
Serial.print(x);

如果有什么不同的话。无论如何,您的代码不是 MCVE,因为我没有看到 main,因此您未共享的部分代码也可能存在问题。

Arduino 上的另一个常见问题是 RAM 内存不足,具体取决于您拥有的 MCU,我希望您有 1 或 2 KB 的 RAM,因此如果您的代码使用更多,您可以轻松覆盖部分变量(特别是如果您包含 ADAFRUIT SSD1306 LCD驱动程序单独占用略高于 1KByte 的 RAM)。

【讨论】:

在合规编译器中 n1 / n2 如果两者都是浮点数,则必须作为浮点数完成。我怀疑 OP 实际上使用了 ints 而不是发布的代码中的浮点数 @phuclv 不期望 MCU 上完全兼容的编译器(你不会相信他们特别是 GCC 的能力)和 ARDUINO 框架不使用 C/C++ 编译器它是一种不同的语言(非常相似但有语法差异)。但是我敢打赌,问题在于 RAM 不足或缺少代码(未共享)。

以上是关于NAN 结果 Arduino Uno [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

Arduino uno 过热

arduino uno IR 接收器电机控制

Arduino UNO ADC模拟按键检测原理介绍

arduino uno +sim900+手机接收短信

为啥arduino uno只能保留两位小数

我用arduino uno 运行simulink 模型的时候,发生以下错误:求大神求解,没有财富值,实在是抱歉