与浮点运算对比的定点

如何在程序中对算术进行编码 (无论是算术语句,内部函数,表达式还是它们相互嵌套的某种组合) ,确定是使用浮点运算还是定点运算来完成求值。

程序中的许多语句可能涉及算术。 例如,以下每种 COBOL 语句都需要进行算术运算:

  • 一般算术
    
    compute report-matrix-col = (emp-count ** .5) + 1
    add report-matrix-min to report-matrix-max giving report-matrix-tot
    
  • 表达式和函数
    
    compute report-matrix-col = function sqrt(emp-count) + 1
    compute whole-hours       = function integer-part((average-hours) + 1)
    
  • 算术比较
    
    if report-matrix-col <     function sqrt(emp-count) + 1
    if whole-hours       not = function integer-part((average-hours) + 1)
    

浮点求值

通常,如果您的算术编码具有下列任一特征,那么将在浮点算术中对其进行求值:

  • 操作数或结果字段是浮点。

    如果将操作数编码为浮点文字,或者将其编码为定义为 USAGE COMP-1USAGE COMP-2或外部浮点 (USAGE DISPLAY USAGE NATIONAL ,带有浮点 PICTURE) 的数据项,那么该操作数是浮点。

    当满足下列任何条件时,作为嵌套算术表达式或对数字内部函数的引用的操作数将生成浮点算术:

    • 算术表达式中的自变量会生成浮点。
    • 该函数是浮点函数。
    • 该函数是具有一个或多个浮点自变量的混合函数。
  • 指数包含小数位。

    如果使用包含小数位的文字,为项提供包含小数位的 PICTURE ,或者使用其结果具有小数位的算术表达式或函数,那么指数包含小数位。

如果任何操作数或自变量 (不包括 divisors 和指数) 具有小数位,那么算术表达式或数字函数会生成具有小数位的结果。

定点评估

一般来说,如果一个算术运算既不包含上一节所列的浮点特性,编译器就会使其按定点运算进行运算。 换言之,仅当所有操作数都是固定点,结果字段被定义为固定点,并且没有任何指数表示具有小数位的值时,才会将算术求值作为固定点处理。 嵌套算术表达式和函数引用还必须表示定点值。

算术比较 (关系条件)

使用关系运算符比较数字表达式时,数字表达式 (无论它们是数据项,算术表达式,函数引用还是它们的某些组合) 在整个求值的上下文中是比较的。 即,每个表达式的属性会影响另一个表达式的求值: 这两个表达式都在固定点中求值,或者这两个表达式都在浮点中求值。 简略比较也是如此,即使在比较中没有明确出现一个比较。 例如:


if (a + d) = (b + e) and c

此语句具有两个比较: (a + d) = (b + e)(a + d) = c。 虽然 (a + d) 未显式出现在第二个比较中,但它是该比较中的一个比较。 因此, c 的属性可能会影响 (a + d)的求值。

如果比较是浮点值或解析为浮点值,那么编译器将处理浮点算术中的比较 (以及任何嵌套在比较中的算术表达式的求值)。

如果两个比较都是定点值或解析为定点值,那么编译器将处理定点算术中的比较 (以及对嵌套在比较中的任何算术表达式的求值)。

但是,不将隐式比较 (不使用关系运算符) 作为一个单位来处理; 这两个比较在浮点或定点算术中分别处理它们的求值。 在以下示例中,五个算术表达式将独立于彼此的属性进行求值,然后相互比较。


evaluate (a + d)
    when (b + e) thru c
    when (f / g) thru (h * i)
    . . .
end-evaluate

例如:定点和浮点运算