IBM PL / I: использование фиксированной переменной - PullRequest
0 голосов
/ 02 марта 2020

Мне попалась рекомендация по коду для IBM PL / I: не создавать переменную фиксированного типа. Пример неправильного кода:

DECLARE avar FIXED BIN; 

, в то время как указан правильный код:

DECLARE avar BIN; 

Я хотел знать, является ли это правильной рекомендацией, потому что слишком много вхождений в код, существующий и новый, где «исправлено» будет и будет использоваться. И если это правильная рекомендация, должна ли она быть применима только к "BIN" или BIN (n, m).

У меня нет большого опыта работы с IBM PL / I, поэтому, пожалуйста, извините за наивность в вопросе выше .

Заранее спасибо!

1 Ответ

0 голосов
/ 05 марта 2020

Я могу только догадываться об обосновании этого "руководства по кодированию".

В PL / 1 число может быть двоичным (BIN) или десятичным (DE C). Обычно, когда мы думаем о числах, мы думаем о десятичном, а не двоичном. Поэтому мы думаем о числах вроде 123,45 (FIXED DE C (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, когда оно отсутствует в спецификации точности с фиксированной точкой.

Тогда вы можете быть удивлены DE C. Вам, вероятно, следует использовать FIXED DEC (p,q), чтобы получить то, о чем вы, вероятно, думаете, как число с фиксированной точкой, например валюта. Скорее всего, они закодированы в виде упакованного десятичного числа, где каждый ди git хранится в клочке (4 бита) со знаком в последнем клочке. Таким образом, 123.45 будет храниться как x'12 34 5f', где x'f' положительно или без знака, а x'd' отрицательно. Десятичная точка принимается, а не сохраняется.

Таким образом, для суммирования, для точных вычислений используйте FIXED DEC, а для вычисления с плавающей запятой - BIN или FLOAT BIN.

...