2

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

DECLARE avar FIXED BIN; 

而给出的正确代码是:

DECLARE avar BIN; 

我想知道这是否是正确的建议,因为代码中出现的次数太多了,无论是现有的还是新的,其中“固定”将被使用。如果它是正确的建议,它应该只适用于“BIN”还是 BIN(n,m)。

4

1 回答 1

2

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

在 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

所以 FIXED BIN 可能不是一个好主意。不是每一个固定的十进制数都可以用 FIXED BIN 表示,也不是很直观。

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

至于 (p) 与 (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,对于浮点计算使用BINor FLOAT BIN

于 2020-03-05T16:27:47.583 回答