选择数字格式
选择使用哪种格式很大程度上取决于计算的要求。 IRIS
十进制格式允许超过 18
位十进制数字的精度,而 $DOUBLE
只能保证 15
位。
在大多数情况下,十进制格式更易于使用并提供更精确的结果。它通常适用于涉及十进制值的计算(例如货币计算),因为它给出了预期的结果。十进制分数通常不能精确地表示为二进制分数。
另一方面,$DOUBLE
中的数字范围明显大于本机格式允许的范围:1.0E308
与 1.0E145
。那些范围是重要因素的应用程序应使用 $DOUBLE
。
将在外部共享数据的应用程序也可以考虑以 $DOUBLE
格式维护数据,因为它不会进行隐式转换。大多数其他系统使用 IEEE
标准作为二进制浮点数的表示形式,因为它直接受到底层硬件架构的支持。因此,十进制格式的值必须先进行转换,然后才能进行交换,例如通过 ODBC/JDBC
、SQL
或语言绑定接口。
如果 $DOUBLE
值在为 IRIS
十进制数定义的范围内,则将其转换为十进制,然后转换回 $DOUBLE
值将始终产生相同的数字。反之则不然,因为 $DOUBLE
值的精度低于十进制值。
因此,建议尽可能以一种表示形式或另一种表示形式进行计算。在表示形式之间来回转换值可能会导致准确性损失。大多数应用程序可以使用 IRIS
十进制格式进行所有计算。 $DOUBLE
格式旨在支持那些与使用 IEEE
格式的系统交换数据的应用程序。
相比 $DOUBLE
更喜欢 IRIS
十进制的原因是:
IRIS
十进制具有更高的精度,几乎有19
位十进制数字,而$DOUBLE
的十进制数字不到16
位。IRIS
十进制可以精确地表示小数部分。值0.1
是IRIS
十进制的精确值;但二进制浮点数中没有精确的等价物,因此0.1
必须以$DOUBLE
格式近似。
对于科学数而言, $DOUBLE
相对于十进制的优点是:
$DOUBLE
使用与大多数计算硬件使用的IEEE
双精度二进制浮点完全相同的表示形式。$DOUBLE
具有更大的范围:$DOUBLE
的最大范围为1.7E308
, 十进制的最大范围为9.2E145
。
转换:字符串
当将值从字符串转换为数字时,或者在编译程序时处理写入的常量时,只有前 38
位有效数字可以影响尾数的值。其后的所有数字将被视为零;也就是说,它们将用于确定指数的值,但不会对有效数字值产生额外影响。
字符串作为数字
在 IRIS
中,如果在表达式中使用字符串,则该字符串的值是该字符串中从第一个字符开始包含的最长数字文字的值。如果不存在这样的文字,则字符串的计算值为零。
数字字符串作为下标
在计算中,字符串“04
”和“4
”之间没有区别。但是,当此类字符串用作本地或Global
数组的下标时, IRIS
会对它们进行区分。
在 IRIS 中,包含前导零(在减号之后,如果有的话)或小数部分末尾尾随零的数字字符串在用作下标时将被视为字符串。作为字符串,它们有一个数值;它们可以用于计算。但作为局部或Global
的下标,它们被视为字符串并按字符串进行整理。因此,在对列表中:
-
4 versus 04
-
10 versus 10.0
-
.001 versus 0.001
-
.3 versus -0.3
-
1 versus +01
左边的那些用作下标时被视为数字,右边的那些被视为字符串。 (左侧的形式没有无关的前导和尾随零部分,有时被称为规范形式。)
SET ^||TEST("2") = "standard"
SET ^||TEST("01") = "not standard"
SET NF = "Not Found"
WRITE """2""", ": ", $GET(^||TEST("2"),NF), !
WRITE 2, ": ", $GET(^||TEST(2),NF), !
WRITE """01""", ": ", $GET(^||TEST("01"),NF), !
WRITE 1, ": ", $GET(^||TEST(1),NF), !, !
SET SUBS=$ORDER(^||TEST(""))
WRITE "Subscript Order:", !
WHILE (SUBS '= "") {
WRITE SUBS, !
SET SUBS=$ORDER(^||TEST(SUBS))
}