浮点值
此信息适用于
CompactLogix
5370、ControlLogix
5570、Compact GuardLogix
5370、GuardLogix
5570、Compact GuardLogix
5380、CompactLogix
5380、ControlLogix
5580、GuardLogix
5580 和 ControlLogix 5590 控制器。在适用的情况下会注明控制器的差异。Logix 控制器根据 IEEE 754 浮点数算术标准处理浮点值。该标准规定了浮点数的存储和计算方法。IEEE 754 浮点数运算标准的设计宗旨是,能够在合理的存储空间内迅速处理超大量的数字。
REAL 标签存储单精度型归一化浮点数。
LEAL 标签存储双精度型归一化浮点数。
控制器支持以下基本数据类型:
控制器 | 数据类型 |
|---|---|
CompactLogix 5380、ControlLogix 5580、Compact GuardLogix 5380、GuardLogix 5580 和 ControlLogix 5590 控制器 | REAL, LREAL |
CompactLogix 5370、ControlLogix 5570、Compact GuardLogix 5370 和 GuardLogix 5570 控制器 | REAL |
非归一化数值和 -0.0 按 0.0 处理
如果计算结果为 NAN 值,则符号位可以为正或负。这种情况下,软件会显示无符号的 1#.NAN。
并非所有十进制数值都能以这种标准格式准确表示,可能会出现精度损失。例如,10.1 减去 10,结果应为 0.1。但在 Logix 控制器中,结果可能是 0.10000038。在本例中,0.1 与 0.10000038 相差 0.000038%,近似为零。对大多数运算而言,这种细微的不精确性并不重要。从更深层次看,将一个浮点值发送给一个模拟输出模块,与发送一个相差 0.000038% 的值相比,不会引起输出电压的差异。
浮点数算术运算法则
运算法则如下:
执行某些浮点算术运算时,可能会因四舍五入误差而造成精度损失。浮点数处理器的内在精度会影响结果值。
不应对金额或累加器函数使用浮点运算。应使用 INT 或 DINT 值,放大数值并跟踪小数位(或者对美元使用一个 INT 或 DINT 值,对美分使用另一个 INT 或 DINT 值)。
不应比较浮点数。但可以检查数值是否在某个范围内。LIM 指令专用于此用途。
累加器示例
REAL 数据类型的精度会影响累加运算,在将超小数与超大数相加时,将出现误差。
例如,在一段时间内,将某个值与 1 累加。到了某个点,由于中间总和值远大于 1,加法运算不再对结果产生影响,而且没有足够的位来存储整个结果。加法运算会存储尽可能多的高位,而丢弃其余的低位。
为解决这个问题,可先累加小数值,直到获得较大结果。然后将结果传输到其他位置,进行进一步的大数值运算。例如:
- x 为小增量变量。
- y 为大增量变量。
- Z 为可在任何位置使用的当前总计数。
- x = x+1;
- if x = 100,000;
- {
- y = y + 100,000;
- x = 0;
- }
- z = y + x;
另一个示例:
- x = x + some_tiny_number;
- if (x >= 100)
- {
- z = z + 100;
- x = x - 100; // there might be a tiny remainder
- }
提供反馈