【问题标题】: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 左右。

【问题讨论】:

标签: sas


【解决方案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;

【讨论】:

    猜你喜欢
    • 2021-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-05
    • 2011-10-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多