代码之家  ›  专栏  ›  技术社区  ›  Simon Nickerson

为什么在SAS中,科学记数法中的数字文字会给显式写出的数字一个不同的数字?

  •  2
  • Simon Nickerson  · 技术社区  · 15 年前

    以下SAS代码:

    data _null_;
      format t u best32.;
      t = 10000000000000000000000000;
      u = 1e25;
      put t u;
      if t ne u then put 'diff';
    run;
    

    10000000000000000905969664 9999999999999998758486016
    diff
    

    虽然我知道只有前15-16位数字是可信的,但为什么它们给出的基础数字完全不同?SAS计算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
    
    1 回复  |  直到 15 年前
        1
  •  2
  •   paxdiablo    15 年前

    它看起来像是在计算 1 * 10 * 10 ... * 10

    但我不相信IEE754类型的float/double会出现这种情况,因为它能够表示1x10 全范围 没有精度损失。

    一种可能是,您遇到的问题与以低于允许的精度存储浮点的能力有关(这可能会导致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;
    

    根据这个结果,我们可以推断出封面下发生了什么。