IBM PL/I:使用固定变量

  • 本文关键字:变量 PL IBM aix zos pl-i
  • 更新时间 :
  • 英文 :


我遇到了一个针对IBM PL/I的代码建议:不要创建固定类型的变量。错误代码的例子是:

DECLARE avar FIXED BIN; 

而给出的正确代码是:

DECLARE avar BIN; 

我想知道这是否是正确的建议,因为代码中出现的次数太多了,无论是现有的还是新的,其中";固定的";现在和将来都会使用。如果它是正确的建议,它应该只适用于";BIN";或者BIN(n。

我只能猜测这个"编码准则"的基本原理。

在PL/1中,数字可以是二进制(BIN(或十进制(DEC(。一般来说,当我们想到数字时,我们想到的是十进制而不是二进制。所以我们想到的数字是123.45(固定DEC(5,2((,而不是1001101.011B(固定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

所以固定垃圾箱可能不是一个好主意。并不是每个固定的十进制数字都可以在fixed BIN中表示,这并不是真正直观的。

如果未指定FIXED/FLOAT,则FLOAT为默认值。事实上,这就是你可能习惯的浮点数字的存储方式。所以我们可以将它用于我们的常规浮点计算。

至于(p(与(p,q(的问题,(p(表示浮点,(p,q(表示不动点,但当定点精度规范中缺少q时,q默认为0。

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

总之,对于精确计算,使用FIXED DEC,而对于浮点计算,则使用BINFLOAT BIN

相关内容

  • 没有找到相关文章

最新更新