SAS十进制精度和写入数据库
你好 我遇到了这个问题,当时我正在向数据库中写入一些数字,在SAS中应该是值SAS十进制精度和写入数据库,sas,precision,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.1
,但由于一些奇怪的原因,在SQL数据库中显示为0.09
。当我手动检查数据集时,它以12.2格式显示0.10
因此,我要做的是检查值是否实际为0.1或略低于此值:
data _checking;
set publish_data;
if value < 0.1;
dummy = value*10000000;
run;
数据检查;
设置发布数据;
如果值<0.1;
虚拟=值*10000000;
跑
看来观测的数量满足了第一个条件。好啊这就解释了为什么值为0.09。取整问题
但是,所有的伪值都是整数。我试过10,100,1k,10k都是整数。(1,10,100…)
下一步我尝试:
data _checking2;
set _checking;
if dummy<10; /*Depending on the factorial*/
run;
数据检查2;
设置检查;
假肢
您可以尝试不同的格式。尝试32.31
或best32。
减去0.1-值
,然后查看结果。同样,使用小数位数较多的格式
您可能看不到dummy
变量中的值,因为epsilon非常小,并且dummy仍在四舍五入显示
尝试dummy=value*1e16
或更高版本
SAS中的数字为C双精度,fwiw
您可以尝试不同的格式。尝试32.31
或best32。
减去0.1-值
,然后查看结果。同样,使用小数位数较多的格式
您可能看不到dummy
变量中的值,因为epsilon非常小,并且dummy仍在四舍五入显示
尝试dummy=value*1e16
或更高版本
SAS中的数字是C双精度,fwiw。答案1:
查看实际值的最精确和最人性化的方法是使用HEX
格式观察底层IEEE字节
答案2:
这些新虚拟变量的默认格式是BEST12.
,因此,如果它们小于BEST12,则不会看到任何小偏移。将显示或更精确地显示ε<1e-(12-log10(x))。在这种情况下,SAS格式可能被视为显示问题
如果您的用例是“显示的”值必须是发送到远程数据库的实际值,那么在填充远程表之前,您将希望使用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:
查看实际值的最精确和最人性化的方法是使用HEX
格式观察底层IEEE字节
答案2:
这些新虚拟变量的默认格式是BEST12.
,因此,如果它们小于BEST12,则不会看到任何小偏移。将显示或更精确地显示ε<1e-(12-log10(x))。在这种情况下,SAS格式可能被视为显示问题
如果您的用例是“显示的”值必须是发送到远程数据库的实际值,那么在填充远程表之前,您将希望使用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
SAS以二进制表示数字(使用IEEE浮点标准)。“尽管IEEE平台使用相同的规范集,但由于编译器差异和数学库差异,您可能偶尔会看到不同平台之间的不同结果”。SAS以二进制表示数字(使用IEEE浮点标准)。“尽管IEEE平台使用相同的规范集,但由于编译器差异和数学库差异,您可能偶尔会看到不同平台之间的不同结果”。