double PresetFlow2PVavleDuty(float presetflow)
{
double n[8] = {
49.2335778711886, // a 0
55.9585083556069, // b 1
-13.5915770179714, // c 2
1.54143446997669, // d 3
-0.0897576896073748, // e 4
0.00281694608223768, // f 5
-4.53186805980947E-05, // g 6
2.93852523414571E-07, // h 7
};
float x = presetflow;
double duty = 0;
float x = presetflow;
double duty =(n[7]*pow(x, 7) + n[6]*pow(x, 6) + n[5]*pow(x, 5) + n[4]*pow(x, 4) + n[3]*pow(x, 3) + n[2]*pow(x, 2) + n[1]*x + n[0]);
return duty;
}
同样的上面一段代码,在PC上测试计算完全没问题,在STM32上计算就出现大问题,用12实参传入计算得到结果是七十多万。。。。正确应该是140多。
难道STM32不支持double?
猜测可能最后一步计算太大导致计算有误,遂改为如下:
double PresetFlow2PVavleDuty(float presetflow)
{
double n[8] = {
49.2335778711886, // a 0
55.9585083556069, // b 1
-13.5915770179714, // c 2
1.54143446997669, // d 3
-0.0897576896073748, // e 4
0.00281694608223768, // f 5
-4.53186805980947E-05, // g 6
2.93852523414571E-07, // h 7
};
float x = presetflow;
double duty = 0;
char i;
double result[7];
result[0] = n[1]*x;
result[1] = n[2]*pow(x, 2);
result[2] = n[3]*pow(x, 3);
result[3] = n[4]*pow(x, 4);
result[4] = n[5]*pow(x, 5);
result[5] = n[6]*pow(x, 6);
result[6] = n[7]*pow(x, 7);
for (i = 0; i < 7; i++)
{
duty += result[i];
}
duty += n[0];
return duty;
}
结果同样是PC上正确,STM32上就错了。
接着修改为:
double PresetFlow2PVavleDuty(float presetflow)
{
double n[8] = {
49.2335778711886, // a 0
55.9585083556069, // b 1
-13.5915770179714, // c 2
1.54143446997669, // d 3
-0.0897576896073748, // e 4
0.00281694608223768, // f 5
-4.53186805980947E-05, // g 6
2.93852523414571E-07, // h 7
};
double duty = 0;
float x = presetflow;
double x2 = pow(x, 2);
double x3 = pow(x, 3);
double x4 = pow(x, 4);
double x5 = pow(x, 5);
double x6 = pow(x, 6);
double x7 = pow(x, 7);
double result[7];
result[0] = n[1]*x;
result[1] = n[2]*x2;
result[2] = n[3]*x3;
result[3] = n[4]*x4;
result[4] = n[5]*x5;
result[5] = n[6]*x6;
result[6] = n[7]*x7;
for (char i = 0; i < 7; i++)
{
duty += result[i];
}
duty += n[0];
return duty;
}
计算结果还是错误的。
难道是pow函数的锅?
进一步修改:
double PresetFlow2PVavleDuty(float presetflow)
{
double n[8] = {
49.2335778711886, // a 0
55.9585083556069, // b 1
-13.5915770179714, // c 2
1.54143446997669, // d 3
-0.0897576896073748, // e 4
0.00281694608223768, // f 5
-4.53186805980947E-05, // g 6
2.93852523414571E-07, // h 7
};
double duty = 0;
float x = presetflow;
float x2 = x * x;
float x3 = x2 * x;
float x4 = x3 * x;
float x5 = x4 * x;
float x6 = x5 * x;
float x7 = x6 * x;
double result[7];
result[0] = n[1]*x;
result[1] = n[2]*x2;
result[2] = n[3]*x3;
result[3] = n[4]*x4;
result[4] = n[5]*x5;
result[5] = n[6]*x6;
result[6] = n[7]*x7;
for (char i = 0; i < 7; i++)
{
duty += result[i];
}
duty += n[0];
return duty;
}
结果正确了。。。
不知道是不是pow函数的锅,还有MCU做大数值计算最好还是得分步计算