2

以下 SAS 代码:

data _null_;
  format t u best32.;
  t = 10000000000000000000000000;
  u = 1e25;
  put t u;
  if t ne u then put 'diff';
run;

在我的 Windows 机器上打印出:

10000000000000000905969664 9999999999999998758486016
diff

虽然我知道只有前 15-16 位数字是可信的,但为什么它们给出不同的基础数字呢?SAS如何计算1e25?

编辑:我被要求提供 10 到 1e25 的其他幂的输出。以下程序:


%macro doit;
data _null_;
  format t u best32.;
%let t=1;
%do i=1 %to 25;
  %let t=&t.0;
  t = &t;
  u = 1e&i;
  put t u;
%end;
run;
%mend;
%doit;

给出以下输出:


10 10
100 100
1000 1000
10000 10000
100000 100000
1000000 1000000
10000000 10000000
100000000 100000000
1000000000 1000000000
10000000000 10000000000
100000000000 100000000000
1000000000000 1000000000000
10000000000000 10000000000000
100000000000000 100000000000000
1000000000000000 1000000000000000
10000000000000000 10000000000000000
100000000000000000 100000000000000000
1000000000000000000 1000000000000000000
10000000000000000000 10000000000000000000
100000000000000000000 100000000000000000000
1000000000000000000000 1000000000000000000000
10000000000000000000000 10000000000000000000000
99999999999999991611392 99999999999999991611392
999999999999999983222784 999999999999999983222784
10000000000000000905969664 9999999999999998758486016
4

1 回答 1

2

看起来它实际上可能正在计算1 * 10 * 10 ... * 10,并且一旦超出底层浮点类型的大量位数,错误就会蔓延。

但我不相信 IEE754 类型的浮点/双精度会发生这种情况,因为它完全能够表示 1x10全范围而不损失精度。

一种可能性是您遇到的问题与以低于允许的精度存储浮点数的能力有关(这可能会搞砸 1e25 计算) - 请参阅http://www.uc.edu/sashtml/lrcon/z0695157。 htm#z0695187进行解释。

更新1:

好的,所以根据您的评论,您没有限制长度。下面的代码给了你什么?

t = 10;
u = 1e1;
put t u;
t = 100;
u = 1e2;
put t u;
t = 1000;
u = 1e3;
put t u;
: : :
t = 10000000000000000000000000;
u = 1e25;
put t u;

基于该输出,我们可能可以推断出幕后发生的事情。

于 2009-05-07T12:35:04.600 回答