SAS十进制精度和写入数据库

时间:2018-01-02 14:13:04

标签: sas precision

美好的一天,

我遇到了这个问题,我在数据库中编写了一些数字,这些数字应该在SAS中具有值0.1,但由于某些奇怪的原因在SQL数据库中显示为0.09。当我手动检查数据集时,它以 12.2 的格式显示0.10

所以我所做的就是检查这些值是否实际为0.1或略低于此值:

data _checking;
    set publish_data;
    if value < 0.1;
    dummy = value*10000000;
run;

看来观察次数满足第一个条件。好的......这就解释了为什么值为0.09。舍入问题。

但是,所有虚拟值都以整数形式出现。我试过10,100,1k,10k似乎都是整数。 (1,10,100 ......)

下一步我尝试:

data _checking2;
    set _checking;
    if dummy<10; /*Depending on the factorial*/
run; 

这是一致的。 Dummy保留的值略低于显示的值&#39;。

我通过round(value,.1);

解决了这个问题

问题

  1. 如何观察存储在数据集中的实际值? (特别是如果&#39;稍微低于&#39;)

  2. 如果第一个条件if为真,那么dummy的检查如何仍然显示整数值。 (因为在计算机中epsilon必须具有实际值)

    2.b或者这只是一个显示问题?或者,SAS是否标记为“减去epsilon&#39;?

2 个答案:

答案 0 :(得分:2)

回答1:

查看实际值的最精确和最不人性化的方法是使用HEX格式观察基础IEEE字节。

回答2:

这些新虚拟变量的默认格式为BEST12.,因此如果它们小于最佳值12,您将不会看到任何小的偏移量。将显示,或更确切地说,epsilon&lt; 1e-(12-日志10(X))。在这种情况下,SAS格式可能被视为显示问题。

如果您的用例是“显示”的用例。 value必须是发送到远程数据库的实际值,然后您需要在填充远程表之前使用ROUND

data x;
  x = 1/3; output;
  x = 0.1 - 1e-13; output;
  format x 12.2;
run;

data y;
  set x;

  put x= x= HEX16.;

  xhex = x;
  format xhex hex16.;

  array dummy dummy1-dummy13;
  do _n_ = 1 to 13;
    dummy(_n_) = x * 10**_n_;
  end;
run;

proc print data=y;
run;

data z;
  do p = 0 to 10;
  do q = 1 to 15;
    array z z1-z15;
    z(q) = 10**p + 10**-q;
  end; output;
  end;
  drop p q;
run;

==== LOG ====
x=0.33 x=3FD5555555555555
x=0.10 x=3FB9999999997D74

==== PRINT ====
Obs            x             xhex  dummy1  dummy2  dummy3  dummy4  dummy5    dummy6    dummy7

 1          0.33 3FD5555555555555 3.33333 33.3333 333.333 3333.33 33333.33 333333.33 3333333.33
 2          0.10 3FB9999999997D74 1.00000 10.0000 100.000 1000.00 10000.00 100000.00 1000000.00

Obs    dummy8         dummy9          dummy10        dummy11         dummy12           dummy13

 1  33333333.33    333333333.33    3333333333.3    33333333333    333333333333    3.3333333E12
 2  10000000.00    100000000.00    1000000000.0    10000000000    100000000000    999999999999

答案 1 :(得分:1)

  1. 您可以尝试不同的格式。试试32.31best32.
  2. 减去0.1-value并查看结果。再次,使用具有大量小数位的格式。
  3. 您可能没有看到dummy变量中的值,因为epsilon非常小,并且虚拟对象仍在四舍五入以进行显示。

    1. 尝试dummy=value*1e16或更高。
    2. SAS中的数字是C双打,fwiw。