介绍
IRIS
有两种不同的数字表示方式:
-
其中第一个根源于
IRIS
的原始实现。这种表示形式将被称为十进制格式。在类定义中,当希望属性包含十进制格式数字时,可以数据类型类中使用
%Library.Decimal
。 -
最近支持的第二种形式遵循
IEEE
二进制浮点算术标准(#754–2019
)。在用于将数字转换为这种形式的ObjectScript
函数 ($DOUBLE
) 之后,后一种格式称为$DOUBLE
格式。在类定义中,当希望属性包含
$DOUBLE
格式数字时,可以数据类型类中使用%Library.Double
。
SQL 表示
SQL
数据类型 DOUBLE
和 DOUBLE PRECISION
表示 IEEE
浮点数,即 $DOUBLE
。 SQL 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-128
到 9.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
的整数。作为整数,可以精确表示
0
到9,007,199,254,740,992
之间的所有值。较大的整数可能有也可能没有精确的表示,具体取决于它们的位模式。
此表示形式具有 IRIS
本机格式所不具备的三个可选功能:
- 能够将无效计算(例如取负数的平方根)的结果表示为
NaN
(非任何数字)。 - 能够同时表示
+0
和-0
。 - 代表无穷的能力。
- 该标准规定了小于
2 ** -1022
的数字的表示。这是通过一种称为逐渐损失精度的技术来完成的。
这些功能通过单个进程的 %SYSTEM.Process
类的 IEEEError()
方法或整个系统的 Config.Miscellaneous
类的 IEEEError()` 方法受程序控制。
重要信息:使用 IEEE
二进制浮点表示形式的计算对于相同的 IEEE
运算可能会给出不同的结果。 已经编写了自己的实现:
$DOUBLE
二进制浮点数和十进制之间的转换;$DOUBLE
和数字字符串之间的转换;$DOUBLE
和其他数字类型之间的比较。
这保证了当 $DOUBLE
值插入 IRIS
数据库或从 IRIS
数据库中提取时,所有硬件平台的结果都是相同的。
但是,对于涉及 $DOUBLE
类型的所有其他计算,IRIS
使用供应商提供的浮点库子例程。这意味着同一组操作的平台之间可能存在细微差别。然而,在所有情况下,$DOUBLE
计算都等于对 C double
类型执行的本地计算;也就是说 $DOUBLE
计算平台之间的差异绝不会比在相同平台上运行的计算 IEEE
值的 C
程序所表现出的差异更严重。