MULTIPLY не ведет себя так, как я ожидал - PullRequest
0 голосов
/ 30 мая 2018

У меня есть эта программа cobol, предназначенная для вычисления факториала:

   IDENTIFICATION DIVISION.
   PROGRAM-ID. Factorial-hopefully.
   AUTHOR. Darth Egregious.
   DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 Keeping-Track-Variables.
      05 Operand                      PIC S99   VALUE 0.
      05 Product                      PIC S99   VALUE 1.
   PROCEDURE DIVISION.
   PERFORM-FACTORIAL.
    DISPLAY SPACES
    PERFORM VARYING Operand FROM 6 BY -1 UNTIL Operand = 0

      DISPLAY "Before Product " Product " Operand " Operand
      MULTIPLY Product By Operand GIVING Product
      DISPLAY "After Product " Product " Operand " Operand
    END-PERFORM
    DISPLAY Product.
   STOP RUN.

Я запускаю ее так:

cobc -free -x -o a.out fact.cbl && ./a.out

И получаю странный вывод:

Before Product +01 Operand +06
After Product +06 Operand +06
Before Product +06 Operand +05
After Product +30 Operand +05
Before Product +30 Operand +04
After Product +30 Operand +04
Before Product +30 Operand +03
After Product +90 Operand +03
Before Product +90 Operand +02
After Product +90 Operand +02
Before Product +90 Operand +01
After Product +90 Operand +01
+90

Мой декрементный цикл работает, как и ожидалось, но команда MULTIPLY ведет себя странно.Он делает 1*6 и 6*5 правильно, но 30*4, похоже, не работает, тогда 30*3 работает, и, наконец, 90*2 снова не работает.Разве КОБОЛ не любит умножения на степени двух или чего-то еще?

1 Ответ

0 голосов
/ 30 мая 2018

Мой декрементный цикл работает, как и ожидалось, но команда MULTIPLY ведет себя странно.Он делает 1 * 6 и 6 * 5 правильно, но 30 * 4, кажется, не работает, тогда 30 * 3 делает, и, наконец, 90 * 2 снова не работает.Разве COBOL не нравится умножение на степени двух или чего-то еще?

  05 Operand                      PIC S99   VALUE 0.
  05 Product                      PIC S99   VALUE 1.

Когда вы умножаете 30*4 и 90*2, значения больше, чем предложение PICTURE, S99.

Увеличьте размер предложения PIC, скажем, до S999.


Ответ на комментарии:

Технически, результат не определен [COBOL 85], поэтому бездействие - правильный выбор.Другие реализации усекают значение, давая другой результат.

Так что это не столько язык, сколько реализация.

Язык также позволяет фразе SIZE ERROR перехватывать усечение.ошибки.В этой ситуации результат не изменяется, но может быть выполнен дополнительный код, чтобы указать, что произошла ошибка.

При COBOL 2002 результат определяется разработчиком, если фраза ON SIZE ERROR непроверка и проверка исключения EC-SIZE-TRUNCATION не активны.


Цитата из стандарта 2002 года:

F.1 Существенные изменения, потенциально влияющие на существующие программы

15) Условие ошибки размера без фразы SIZE ERROR.Если возникает ошибка размера, инструкция, в которой она возникает, не содержит фразы SIZE ERROR или NOT SIZE ERROR, и не существует связанной декларации, разработчик определяет, завершен ли модуль выполнения или выполнение продолжается с неправильными значениями.

Обоснование:

В предыдущем стандарте COBOL правила ошибки размера указывали, что выполнение будет продолжаться с неопределенными значениями, но было неясно, где будет продолжаться выполнение, особенно в условных выражениях.Кроме того, продолжение выполнения с неверными результатами было неприемлемо для многих критически важных приложений, где это может привести к повреждению баз данных, некорректному продолжению выполнения программы и, возможно, множеству дополнительных ошибок.Запрещалось изменять программы для добавления ОШИБКИ НА РАЗМЕР для каждого затронутого оператора.Отвечая требованиям пользователя, несколько разработчиков прекратили выполнение программы в этой ситуации;в некоторых случаях разработчик допускал выбор завершения на основе директивы компилятора.

Количество и критичность приложений, которые прекратили работу в этой ситуации, дают веские основания для этого изменения.Ожидается, что это изменение окажет небольшое влияние на существующие программы, поскольку разработчики могут продолжить или прекратить работу в соответствии с реализацией предыдущего стандарта COBOL.

...