【发布时间】:2014-04-05 21:53:56
【问题描述】:
data temp;
length a 1 b 3 x;
infile '';
input a b x;
run;
答案是“未创建数据集 TEMP,因为变量 A 的长度无效”。 为什么在这个小程序中无效?
【问题讨论】:
-
你还有一个问题,
x在长度语句中,但实际上并没有在那里定义。
标签: sas variable-length
data temp;
length a 1 b 3 x;
infile '';
input a b x;
run;
答案是“未创建数据集 TEMP,因为变量 A 的长度无效”。 为什么在这个小程序中无效?
【问题讨论】:
x 在长度语句中,但实际上并没有在那里定义。
标签: sas variable-length
这是无效的,因为 SAS 不允许您创建长度小于 3 或大于 8 的数值变量。
【讨论】:
Length 用于数字变量与显示宽度无关(仅由format 控制);它是用于保存变量的存储空间。在字符变量中可以这样使用,因为每个字符占用1个字节,所以$7长度直接等价于$7.格式。如果您想限制数字在屏幕上的显示方式,请使用format 语句来控制它(format a 1.;)。如果您想告诉 SAS 将多少个字符输入到一个数字中,请使用 informat (informat a 1.;)。
但是,对于数值变量,没有相同的关系。大多数数字是 8 个字节,它将数字的二进制表示形式存储为双精度浮点数。因此,格式为 1. 的数字通常仍占用这 8 个字节,就像格式为 16.3 的数字一样。
现在,如果您愿意,可以在一定程度上限制长度,但需要考虑一些因素。如果限制数值变量的长度,则可能会丢失一些精度。在1. 格式编号中,这不是问题。您可以将最多 8192(作为整数)精确存储在一个三字节数字(3 位精度)中,因此一位是安全的。
一般来说,除非处理非常大量的数据且存储成本非常高,否则不要操纵数字的长度会更安全,因为您可能会遇到计算准确性的问题(例如,除法很可能会导致问题) .限制不是整数大小,而是精度;例如,虽然 8192 是可存储在 3 字节数中的最大整数,但 8191.5 不能存储在 3 字节中。事实上,9/8 可以,但 11/8 不能精确存储——8.192 是最大值,小数点后 3 位,所以 8.125 可以存储,但 8.375 不能存储。
您可以阅读this article,了解有关 Windows 中 SAS 数值精度的更多详细信息。
数字长度可以是 3 到 8。SAS 使用几乎所有的前两个字节来存储符号和指数(第一位是符号,接下来的 11 位是指数),所以 2 字节数字将只有 5 位精度。虽然有些语言有这么小的类型,但 SAS 选择不这样做。
【讨论】: