为什么比较不像我怀疑的那样起作用? PL/I
Why comparision doesn't work as I suspect? PL/I
此比较打印 '0'b
。不明白为什么...据我所知,如果需要,字符串会自动转换为 PL/I 中的 float
。
put skip list('-2.34e-1'=-2.34e-1);
我已经在我们的环境(z/OS 上的企业 PL/I V4.5)中对此进行了测试,发现了相同的行为 - 在某些 compile-options.
下
使用选项 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'
的表示
- 所以在这个 compile-option 下比较相等,你的程序的输出是
'1'b
所以你的问题是编译器对 data-representation 的不同选择和使用不同精度的二进制浮点数导致 rounding-errors 的组合。
此比较打印 '0'b
。不明白为什么...据我所知,如果需要,字符串会自动转换为 PL/I 中的 float
。
put skip list('-2.34e-1'=-2.34e-1);
我已经在我们的环境(z/OS 上的企业 PL/I V4.5)中对此进行了测试,发现了相同的行为 - 在某些 compile-options.
下使用选项 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'
的表示
- 所以在这个 compile-option 下比较相等,你的程序的输出是
'1'b
所以你的问题是编译器对 data-representation 的不同选择和使用不同精度的二进制浮点数导致 rounding-errors 的组合。