IBM PL / I:使用固定变量

问题描述 投票:0回答:1

我遇到了针对IBM PL / I的代码建议:请勿创建固定类型变量。错误代码的示例是:

DECLARE avar FIXED BIN; 

而给出的正确代码是:

DECLARE avar BIN; 

我想知道这是否是正确的建议,因为在代码中,无论是现有的还是新的,都会出现太多的情况,并且将使用“固定”。并且,如果它是正确的建议,那么它也应该仅适用于“ BIN”或BIN(n,m)。

我在IBM PL / I方面没有太多实践,所以请原谅上面提到的幼稚。

提前感谢!

ibm-midrange ibm
1个回答
0
投票

我只能猜测此“编码指南”的基本原理。

在PL / 1中,数字可以是二进制(BIN)或十进制(DEC)。通常,当我们想到数字时,我们以十进制而不是二进制来考虑。因此,我们想到的数字是123.45(FIXED DEC(5,2))而不是1001101.011B(FIXED BIN(10,3))。固定二进制是只奇怪的鸭子,我们通常不直观地理解它。您能告诉我上述固定二进制数是十进制吗?也许是整数部分,但是小数部分呢?

让我们分解一下:

1001101.011B
||||||| ||+---> 1/8          .125
||||||| |+----> 1/4          .25
||||||| +-----> 1/2         0.0
||||||+-------> 1           1
|||||+--------> 2           0
||||+---------> 4           4
|||+----------> 8           8
||+-----------> 16          0
|+------------> 32          0
+-------------> 64         64
                           ======
                           77.375

你明白了吗?换种方式,您可以像这样将123.45转换为固定的二进制文件:

Integer       Fractional
 Part          Part

123.45       .00000000                             .45
-64           |||||||+--> 1/256 = .00390625       -.25
------        ||||||+---> 1/128 = .0078125        ----
 59.45        |||||+----> 1/64  = .015625          .2
-32           ||||+-----> 1/32  = .03125          -.125
------        |||+------> 1/16  = .0625           -----
 27.45        ||+-------> 1/8   = .125             .075
-16           |+--------> 1/4   = .25             -.0625
------        +---------> 1/2   = .5              ------
 11.45                                             .0125
 -8                                               -.0078125
------                                            ---------
  3.45                                             .0046875
 -2                                               -.00390625
------                                            ----------
  1.45                                             .00071825  <--+
 -1                                                              |
                                                                 |
= 1111011B                                      = .01110011B (and it is not exact)

So 123.45 ~ 1111011.01110011B

所以固定BIN可能不是一个好主意。并非每个固定的十进制数字都可以在FIXED BIN中表示,并且这不是很直观。

如果未指定FIXED / FLOAT,则默认为FLOAT。实际上,这就是您可能习惯存储的浮点数的方式。因此,我们可以将其用于常规浮点计算。

关于(p)vs.(p,q)问题,(p)表示浮点,(p,q)表示定点,尽管定点精度规格中缺少q时默认为0 。

然后您可能想知道DEC。您可能应该使用FIXED DEC (p,q)作为货币之类的定点数字来获取您可能正在考虑的内容。这些可能被编码为压缩十进制,其中每个数字存储在一个半字节(4位)中,最后一个半字节中带有一个符号。因此123.45将存储为x'12 34 5f',其中x'f'为正或无符号,而x'd'为负。假定为小数点,不存储。

因此,对于精确计算,请使用FIXED DEC,对于浮点计算,请使用BINFLOAT BIN

© www.soinside.com 2019 - 2024. All rights reserved.