如何比较两个实数的大小是否相等?

描述:
对实数进行计算时,由于实数的结构 (指数形式) 以及非常大的数值范围,经常会发生舍入误差,因此奇偶校验 (所有位都相同) 几乎不会出现。因此,用实数来比较“相等”通常不能获得预期的结果,所以在这里提出其他选择。其中一种方法是采用近似值的方法。本条目介绍了一种您可以据以给实数进行比较的近似值算法,还包含了一个应用该近似值算法的实例。本条目还简要介绍了实数的格式。

用近似值来比较实数值是否相等
此处所述的比较实数所用的近似值基于以下公式:

|(a -b)/(|a| + |b|)| < eps

该近似值可用语言表述如下:
当 a 和 b 之差与 a 和 b 的绝对值之和的比值的绝对值超过“eps”的值时,2 个数值“a”和“b”即被视为相等。

其中需要考虑公式的下列属性:

1. 如果实数“a”和“b”的值非常大,则即使它们相差比较大也被视为等值,此时必须根据系统的需求降低“eps”的值。
如果实数“a”和“b”的值非常小,则只有两数值相差很小时才被视为等值。

注意事项:
此处请注意在一个实数的尾数中,最多只能显示 6 个连续的十六进制数字。

例如

数值举例 1 数值举例 2
(|a| + |b|) 5 5000000
“eps” 10-6 [0.000001]
“a”和“b”可被视为相等时“a”和“b”的差值 0.00000499… 4.999…

表 01

2. 如果“a”和“b”两值都为0,则“a”和“b”的和也是 0。被 0 除是不允许的且会导致错误结果。因此不能使用近似值比较两个精确值都为 0 的实数“a”和“b”。

3. 如果两个被比较的实数有一个是 0,那么这个条目所描述的方法也是不可行的。这种情况下的近似值结果通常为 1。因此比较结果常常是“不相等”,除非“eps”被设定比 1 大。

注意事项:

  • 如果已经发生了被 0 除的操作,则 CPU 通过置位状态位 OS、OV、A0 和 A1 来指示这一错误。
  • 如果数学函数的结果为 0,则两个状态位 A0 和 A1 不置位。

在所附的下载文件中包含压缩归档的 STEP 7 项目,该项目中使用了近似值算法。此处将“eps”的值预置为 10-6。
该程序块是用 STL 编写的,项目中包含一份英文注释版程序 (S7 Program_English) 和一份德文注释版程序 (S7 Programm_German)。

如何比较两个实数的大小是否相等? 附件 1:S7_Gleichheit.zip ( 43 KB )

实数的结构
STEP 7 中的实数类型是 32 位长的数据。每一位的含义如下 (从右到左计算位数):

  • 位 0..22:实数的尾数 (二进制格式)。
  • 位 23..30:实数的指数 (e = 指数 – 127)。
  • 位 31:实数的符号 (0 -> 正数,1 -> 负数)

您可使用以下公式计算实数的值:
符号 * 尾数 * 2 (指数 – 127)

下图 01 以示意图的形式显示了 STEP 7 中使用的 32 位实数的结构。

如何比较两个实数的大小是否相等?
图 01

更多关于 REAL 数据类型的详细信息请参见 S7 在线帮助中“ REAL 数据类型的格式 (浮点数)”目录下的内容。

更多信息
STEP 7(博途) 的一般功能有库的形式并且没有使用权限。这些库特征(通用功能库)包含例如先入先出,搜索功能,矩阵计算,天文计数器, …

Library of general functions for STEP 7 (TIA Portal)

关键词:
浮点,==R,浮点数

原创文章,作者:ximenziask,如若转载,请注明出处:https://www.zhaoplc.com/plc323717.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2020年11月5日
下一篇 2021年4月12日

相关推荐

发表回复

登录后才能评论