函数除法是什么意思

What does It mean by Divide Function

DIVIDE  WS-ENT-CNYR-RED BY 4 GIVING WS-DT-CNYR 
  REMAINDER WS-YR-REMAINDER ON SIZE ERROR.

这是什么意思?

DIVIDE 是一个 COBOL 动词,可让您进行除法运算,就像在数学中一样。

这个和其他数学动词都包含在您的手册和课程笔记中。

您显示的实际 DIVIDE 在语法上是不正确的:您应该在 ON SIZE ERROR 短语之后有一个 "imperative statement"。任何合理的 COBOL 编译器都不允许编译该语句。

DIVIDE 在做什么?这很可能是闰年检查的开始。如果年份可以被四整除,则为闰年候选(也必须不能被 100 整除,除非它可以被 400 整除)。

除法的结果放在 GIVING 后面的数据名中,除法的 "left over" 放在 REMAINDER 后面的数据名中。

通常在使用 REMAINDER 时会除以整数,这对于一年来说是有意义的。 2015 年除以四得到 503,余数为三。不是闰年。

本例中的 ON SIZE ERROR 应该是多余的。它除以文字 (4),除非结果字段不够大以包含结果,否则永远不会出现 SIZE ERROR。

数据定义应该是:

ll  WS-ENT-CNYR-RED                  PIC 9(4).
ll  WS-DT-CNYR                       PIC 9(3). 
ll  WS-YR-REMAINDER                  PIC 9.

除非年份值非常大,否则 WS-DT-CNYR 需要为 9(4)。 ll 是一个级别编号,它将在 01-49(或 1-49)或 77 范围内。

WS-YR-REMAINDER 上应出现 88 级条件名称,类似于:

88  could-be-leap-year               VALUE ZERO.

GIVING 在 COBOL 中很常见。如果不使用 GIVING,则结果存储在语句中提到的字段之一中(对于 DIVIDE,您应该检查哪个字段,MULTIPLYADDSUBTRACT)。

REMAINDER 只有在需要 "modulus" 个除法时才会看到。

除非指定 ROUNDED 短语,否则不会对结果进行四舍五入,使用 REMAINDER 进行四舍五入没有多大意义。

在此示例中,只有 WS-ENT-CNYR-RED 必须 是数字项。 WS-DT-CNYR 和 WS-YR-REMAINDER 都可以是数字编辑项。在格式化报告行时,GIVING 上的项目通常会进行数字编辑。在这段用于开始闰年检查的典型代码中,很可能所有内容都是数字,而且都是整数。

根据这三个项目的使用量和使用方式,它们可能被定义为 PACKED-DECIMAL(或者对于该编译器而言,哪个 COMPUTATIONAL-? 项目是 packed-decimal)甚至二进制。

不需要这是闰年检查的开始。除以四并需要知道余数可能还有其他原因。

注意 DIVIDE ... INTO ... 也是有效的。事实上,1985 COBOL 标准(及更早的标准)中记录了五种不同的 DIVIDE 语句格式,您应该在手册中看到这些格式。

ON SIZE ERROR 告诉编译器在出现 "size error" 时生成代码。 "size error" 是指结果不适合为其提供的字段。

  ON SIZE ERROR 
      imperative-statement.

  ON SIZE ERROR 
      imperative-statement.
END-... (scope-delimiter, consists of END- prefix and verb used, in this case `END-DIVIDE`).

命令式语句可以是多条语句,但通常是一条(将结果字段设置为默认值,通常为零)。因为它可以是多个语句,所以终止该语句非常重要,否则您会使非预期的代码成为命令语句的一部分。

很多人认为ON SIZE ERROR只是针对"divide by zero"才动作的,其实不然。如果由于字段的大小导致结果不适合字段,则会发生 "size error"。

我没有使用 ON SIZE ERROR。我确保非零除数,并且所有结果字段都足够大以包含预期结果。

因为我没有使用ON SIZE ERROR,不知道REMAINDER是否也会导致尺寸错误。我会检查 :-)

好的,我已经检查过了。这是 IBM 的 Enterprise COBOL,除了 Extensions 之外,它还符合 1985 标准。如果 REMAINDER 字段太小而无法容纳余数,则将执行 ON SIZE ERROR 。所以要非常小心余数字段的大小,因为无法知道哪个字段导致了大小错误。

它是这样记录的:

SIZE ERROR phrases For formats 1, 2, and 3, see “SIZE ERROR phrases” on page 296. For formats 4 and 5, if a size error occurs in the quotient, no remainder calculation is meaningful. Therefore, the contents of the quotient field (identifier-3) and the remainder field (identifier-4) are unchanged. If size error occurs in the remainder, the contents of the remainder field (identifier-4) are unchanged. In either of these cases, you must analyze the results to determine which situation has actually occurred.

格式 4 和格式 5 有剩余。

如果您未指定 ON SIZE ERROR,则行为将取决于各个编译器和 运行-time 选项。 Enterprise COBOL 将对字段进行 运行 分类,但仅在进入 运行 时间(语言环境)检查您是否希望发生其他事情之后。相对于指定 ON SIZE ERROR,这将消耗大量时间。

因此,请确保您的字段大小正确。如果您不想这样做,请使用 ON SIZE ERROR。如果将 ON SIZE ERROR 与 REMAINDER 一起使用,您必须在执行任何操作之前自行确定导致 SIZE ERROR 的原因。

ON SIZE ERROR 有对应的,NOT ON SIZE ERROR。它的用法与 ON SIZE ERROR 类似,只是有明显的区别。 ON SIZE ERROR 和 NOT ON SIZE ERROR 可以同时使用:

DIVIDE WS-ENT-CNYR-RED       BY 4 
  GIVING                     WS-DT-CNYR 
  REMAINDER                  WS-YR-REMAINDER 
    ON SIZE ERROR
        imperative-statement-1
    NOT ON SIZE ERROR
        imperative-statement-2
END-DIVIDE (or .)