IBM PL/I:使用固定变量
IBM PL/I: Using Fixed variable
我遇到了 IBM PL/I 的代码建议:不要创建固定类型变量。错误代码的例子是:
DECLARE avar FIXED BIN;
而给出的正确代码是:
DECLARE avar BIN;
我想知道这是否是正确的建议,因为代码中出现的次数太多,无论是现有的还是新的,都将使用“已修复”。
如果它是正确的建议,它是否也只适用于“BIN”或 BIN(n,m)。
我只能猜测这个 "coding guideline" 的基本原理。
在PL/1中,一个数字可以是二进制(BIN)或十进制(DEC)。通常,当我们想到数字时,我们会想到十进制而不是二进制。所以我们想到像 123.45 (FIXED DEC (5,2)) 这样的数字,而不是 1001101.011B (FIXED BIN (10,3))。 Fixed binary 是个奇怪的东西,我们一般不会凭直觉去理解它。你能告诉我上面提到的固定二进制数的十进制是多少吗?也许是整数部分,但小数部分呢?
让我们分解一下:
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) 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
,浮点计算使用BIN
或FLOAT BIN
。
我遇到了 IBM PL/I 的代码建议:不要创建固定类型变量。错误代码的例子是:
DECLARE avar FIXED BIN;
而给出的正确代码是:
DECLARE avar BIN;
我想知道这是否是正确的建议,因为代码中出现的次数太多,无论是现有的还是新的,都将使用“已修复”。 如果它是正确的建议,它是否也只适用于“BIN”或 BIN(n,m)。
我只能猜测这个 "coding guideline" 的基本原理。
在PL/1中,一个数字可以是二进制(BIN)或十进制(DEC)。通常,当我们想到数字时,我们会想到十进制而不是二进制。所以我们想到像 123.45 (FIXED DEC (5,2)) 这样的数字,而不是 1001101.011B (FIXED BIN (10,3))。 Fixed binary 是个奇怪的东西,我们一般不会凭直觉去理解它。你能告诉我上面提到的固定二进制数的十进制是多少吗?也许是整数部分,但小数部分呢?
让我们分解一下:
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) 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
,浮点计算使用BIN
或FLOAT BIN
。