介绍

IRIS 有两种不同的数字表示方式:

  • 其中第一个根源于 IRIS 的原始实现。这种表示形式将被称为十进制格式。

    在类定义中,当希望属性包含十进制格式数字时,可以数据类型类中使用 %Library.Decimal

  • 最近支持的第二种形式遵循 IEEE 二进制浮点算术标准(#754–2019)。在用于将数字转换为这种形式的 ObjectScript 函数 ($DOUBLE) 之后,后一种格式称为 $DOUBLE 格式。

    在类定义中,当希望属性包含 $DOUBLE 格式数字时,可以数据类型类中使用 %Library.Double

SQL 表示

SQL 数据类型 DOUBLEDOUBLE PRECISION 表示 IEEE 浮点数,即 $DOUBLESQL FLOAT 数据类型表示标准 IRIS 十进制数。

十进制格式

IRIS 在内部以两部分表示十进制数。第一个称为有效数字,第二个称为指数:

  • 有效数包含数字的有效数字。它存储为带符号的 64 位整数,假定小数点位于值的右侧。在不损失精度的情况下可以表示的最大指数为 0 的正整数是 9,223,372,036,854,775,807;最大的负整数是-9,223,372,036,854,775,808
  • 指数在内部存储为有符号字节。其值范围为 127-128

这是该值以 10 为底的指数。也就是说,数字的值是有效数乘以 10 的指数次方。

例如,对于 ObjectScript 文字值 1.23,有效数为 123-2 为指数。

因此,可以以 IRIS 本机格式表示的数字范围大约涵盖 1.0E-1289.22E145 的范围。 (第一个值是最小指数的最小整数。第二个值是显示的表示中小数点向左移动且指数相应增加的最大整数。)

所有18位精度的数字都可以准确表示;有效数表示范围内的数字可以准确地表示为 19 位数字。

注意:IRIS 不会对尾数进行标准化,除非需要以十进制格式拟合数字。因此,有效数为 123、指数为 1 的数字与有效数为 1230、指数为 0 的数字比较相等。

$DOUBLE 格式

$DOUBLE 格式符合 IEEE-754–2019,特别是 64 位二进制(双精度)表示形式。这意味着它由三个部分组成:

  • 一个符号位

  • 11 位的两个指数次幂。指数值有 1023 的偏差,因此数字 $DOUBLE(1.0) 的指数内部值为 1023 而不是 0

  • 52 位小数有效数。由于尾数始终被视为正值并进行归一化,因此即使 1 位不存在于尾数中,也将假定其为前导二进制数字。因此,有效数的数字长度为 53 位:值 1,后跟隐含的二进制小数点,最后是小数有效数。可以将其视为隐式除以 2**52 的整数。

    作为整数,可以精确表示 09,007,199,254,740,992 之间的所有值。较大的整数可能有也可能没有精确的表示,具体取决于它们的位模式。

此表示形式具有 IRIS 本机格式所不具备的三个可选功能:

  • 能够将无效计算(例如取负数的平方根)的结果表示为 NaN(非任何数字)。
  • 能够同时表示 +0-0
  • 代表无穷的能力。
  • 该标准规定了小于 2 ** -1022 的数字的表示。这是通过一种称为逐渐损失精度的技术来完成的。

这些功能通过单个进程的 %SYSTEM.Process 类的 IEEEError() 方法或整个系统的 Config.Miscellaneous 类的 IEEEError()` 方法受程序控制。

重要信息:使用 IEEE 二进制浮点表示形式的计算对于相同的 IEEE 运算可能会给出不同的结果。 已经编写了自己的实现:

  1. $DOUBLE 二进制浮点数和十进制之间的转换;
  2. $DOUBLE 和数字字符串之间的转换;
  3. $DOUBLE 和其他数字类型之间的比较。

这保证了当 $DOUBLE 值插入 IRIS 数据库或从 IRIS 数据库中提取时,所有硬件平台的结果都是相同的。

但是,对于涉及 $DOUBLE 类型的所有其他计算,IRIS 使用供应商提供的浮点库子例程。这意味着同一组操作的平台之间可能存在细微差别。然而,在所有情况下,$DOUBLE 计算都等于对 C double 类型执行的本地计算;也就是说 $DOUBLE 计算平台之间的差异绝不会比在相同平台上运行的计算 IEEE 值的 C 程序所表现出的差异更严重。

11-07 09:34