在 SAS 中添加两个大数时,为啥结果是荒谬的?

Posted

技术标签:

【中文标题】在 SAS 中添加两个大数时,为啥结果是荒谬的?【英文标题】:When adding two large numbers in SAS, why are the results nonsensical?在 SAS 中添加两个大数时,为什么结果是荒谬的? 【发布时间】:2022-01-16 16:12:04 【问题描述】:

下面是一些示例代码:

PROC SQL noprint;
          CREATE TABLE check AS
    
                SELECT *, round(var1,1e16) + round(var2,1e16) as final
    
                FROM dir.A;
    
    QUIT; RUN;

我添加的数字是 -3.0584695E31 和 3.058469E31,总和是 4.5035996E15,但实际上,总和应该在 ~1000 左右。

【问题讨论】:

***.com/questions/588004/… 【参考方案1】:

SAS 中的所有数字都是floating point values,精度约为 16 位。这对应于大多数编程语言和数据库中的"double precision"。

当使用大约 1E31 的值进行计算时,您应该预计会出现大约 1E31/1E16 的误差,即 1E15。

【讨论】:

这对了解绝对有帮助【参考方案2】:

您想要做的是围绕结果。对中间步骤进行四舍五入几乎是无关紧要的——两个四舍五入的数字之间的空间仍然有些模糊,除非它恰好已经是一个精确的差异。在某些情况下您可能看不到太大差异,但在其他情况下您会看到很多差异(尤其是当您期望,例如,两个数字之和为零时)。

PROC SQL noprint;
      CREATE TABLE check AS

            SELECT *, round(var1+var2,1e16) as final

            FROM dir.A;

QUIT;

【讨论】:

以上是关于在 SAS 中添加两个大数时,为啥结果是荒谬的?的主要内容,如果未能解决你的问题,请参考以下文章

jmeter察看结果树结果,为啥响应断言为true时,也是红色的?

为啥 LinearRegression() 预测的结果是荒谬的?

SAS多重比较结果怎么看 为啥有空行,是否1%和5%????两个值

为啥在递增 int 时会得到随机结果 [关闭]

SAS HASH :内存失败时,Hash对象添加了***个项

大数四则运算