为什么比较并不像我怀疑的那样有效? PL / I

时间:2017-01-19 15:32:31

标签: mainframe pl-i

此比较打印'0'b。不明白为什么......据我所知,如果需要,字符串会自动转换为PL / I中的float

put skip list('-2.34e-1'=-2.34e-1);

1 个答案:

答案 0 :(得分:3)

我在我们的环境(z / OS上的Enterprise PL / I V4.5)中对此进行了测试,并发现了相同的行为 - 在某些编译选项下。

使用选项FLOAT(NODFP)(即不使用对十进制浮点的本机支持,我认为该选项是在Enterprise PL / I V4.4中引入的),会发生以下情况:

  • 将文字-2.34e-1转换为其内部表示形式bin float(6),即短二进制浮点
  • 将文字'-2.34e-1'bin float(6)值进行比较,因此必须将其转换为bin float
  • 由于-0.234没有二进制小数的精确表示,因此编译器似乎将其转换为bin float(54),即扩展的二进制浮点值,以获得最大精度。
  • 因为-0.234在其二进制表示中的小数点后面有无穷多位数,但是这两个转换后的值保留了不同的位数,这些值不会相等。

FLOAT(DFP)下(即使用机器DFP支持时)

  • 文字-2.34e-1的内部表示是一个实际的十进制浮点,因此确切
  • '-2.34e-1'
  • 的表示
  • 所以在这个编译选项下,比较equ和你的程序的输出是'1'b

所以你的问题是编译器的不同数据表示选择和使用不同精度的二进制浮点产生的舍入误差的组合。