2

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

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

1 回答 1

4

我在我们的环境(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 floata
  • 由于-0.234没有作为二进制分数的精确表示,因此编译器似乎将其转换为 a bin float(54),即扩展的二进制浮点值,以获得最大精度。
  • 因此,由于-0.234在其二进制表示中小数点后的位数是无限的,但是两个转换后的值保留了不同的位数,因此值比较不相等。

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

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

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

于 2017-01-20T10:26:48.047 回答