以下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
答案 0 :(得分:2)
看起来它实际上可能正在计算1 * 10 * 10 ... * 10
,并且一旦超出底层浮点类型的大量位,错误就会逐渐消失。
但我不相信IEE754类型的float / double会发生这种情况,因为它能够在不损失精度的情况下代表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;
根据该输出,我们可以推断出幕后发生的事情。