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



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

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

我已经在我们的环境(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'的表示
  • 因此,在这个编译选项下,两者比较相等,程序的输出为'1'b

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

相关内容

  • 没有找到相关文章

最新更新