编译器从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是在一个自定义库中。 这太奇怪了。 任何人都有这方面的线索?


  • 首先,所有AVR双打都是浮动的,如这里或这里所述。 这使得双打和Arduino Mega 2560上的浮动相同。你可以通过比较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.2input = foo[2];

    链接地址: http://www.djcxy.com/p/13785.html

    上一篇: Strange behavior when compiler converts from float to double

    下一篇: What are the differences between struct and class in C++?