实数的比较有时会出现问题,例如
(*automode
qiankui*)
i_i16pb_In_Pitch_Angle_Setpoint
: INT;
qiankui_old_in_pitch_angle_setpoint
: INT;
qiankui_10_in_pitch_angle_setpoint
: INT;
qiankui_old_10_in_pitch_angle_setpoint
: INT;
qiankui_cycles
: UDINT;
qiankui_10_in_pitch_angle_setpoint :=
REAL_TO_INT(INT_TO_REAL(i_i16pb_In_Pitch_Angle_Setpoint) / 10.0);
qiankui_old_10_in_pitch_angle_setpoint :=
REAL_TO_INT(INT_TO_REAL(qiankui_old_in_pitch_angle_setpoint) / 10.0);
qiankui_diff :=
ABS((INT_TO_REAL(i_i16pb_In_Pitch_Angle_Setpoint) / 10.0) -
INT_TO_REAL(qiankui_10_in_pitch_angle_setpoint));
IF (qiankui_10_in_pitch_angle_setpoint
= qiankui_old_10_in_pitch_angle_setpoint) AND
(ABS((INT_TO_REAL(i_i16pb_In_Pitch_Angle_Setpoint) / 10.0) -
INT_TO_REAL(qiankui_10_in_pitch_angle_setpoint)) <= 0.1) THEN
qiankui_cycles := qiankui_cycles + 1;
ELSE
qiankui_cycles := 0;
END_IF
qiankui_old_in_pitch_angle_setpoint :=
i_i16pb_In_Pitch_Angle_Setpoint;
上述代码if语句中<=0.1有时候会失效,例如将i_i16pb_In_Pitch_Angle_Setpoint强制为12或者-5等值。
在此类情况下,建议将实数放到需要的精度倍数上,然后使用整型数进行比较
例如,两个实时rA和rB,需要保留2位小数,则做如下处理
REAL_TO_INT(rA
* 100) <> REAL_TO_INT(rB * 100)
因为在计算机中0.1可能是0.0999999也可能是0.10000001