编译器从float转换为double时的奇怪行为
我有一个数组:
float foo[3];
在ino文件中,我必须将其中的一个发送给PID作为输入。
double output;
PID myPID(&input, &output, &target, 1, 0.0, 1.1, DIRECT);
...
void loop(){
input =foo[2];
myPID.Compute();
Serial.print(output); //output: "nan"
...
}
PID如下:
PID::PID(double* Input, double* Output, double* Setpoint,
double Kp, double Ki, double Kd, int ControllerDirection)
它编译,但PID值的输出是nan。
但是,如果我将输入设置为-1.2,那么它就可以工作。
void loop(){
input =foo[2];
input = -1.2;
myPID.Compute();
Serial.print(output); //output: "1200"
...
}
我怎样才能解决这个问题? 编译器应该自动转换float的两倍。 和Mega 2560一样。我也尝试过: input =double(foo[2]);
没有任何成功。
编辑:
Serial.print(foo[2]); //Prints -9.2
foo[2] = -9.2; // I manually set foo[2] to -9.2
xAngle = foo[2];
xPID.Compute(); //Computes perfectly.
我必须补充说明foo是在一个自定义库中。 这太奇怪了。 任何人都有这方面的线索?
sizeof(double);
来验证这一点sizeof(double);
和sizeof(float);
两者都会返回4
。 其次,如果你想将一种类型转换为另一种类型,语法是(targetType)sourceType
,那么如果你做了那样的事情,你的任务应该看起来像这样
input =(double)foo[2];
要么
input =(double)(foo[2]);
然而,在这种情况下这是无关紧要的,因为双打和花车是相同的。
我认为这个问题很可能来自这样一个事实,即您的PID控制器不喜欢您在foo[2]
给出您设置的参数的任何值。 在分配input = foo[2];
之前,你尝试过foo[2]=-1.2
吗input = foo[2];
?
上一篇: Strange behavior when compiler converts from float to double
下一篇: What are the differences between struct and class in C++?