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している可能性があり、基になる float 型の有効なビット数を超えるとすぐにエラーが忍び寄っているようです。

しかし、精度を失うことなく 1x10 のフルレンジを表現できるので、IEE754 型の float/double ではそれが起こるとは思いません。

1 つの可能性は、あなたが抱えている問題が、許可されている精度よりも低い精度で float を格納する機能に関連しているということです (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 に答える