2014-01-28 25 views
2

爲什麼以下內容不能產生期望的結果?SAS以增量形式循環運行

data data1; 

do a = 0.0 to 1.0 by 0.1; 
    do b = 0.0 to 1.0 by 0.1; 
     do c = 0.0 to 1.0 by 0.1; 
      do d = 0.0 to 1.0 by 0.1; 
       if (a+b+c+d)=1 then output; 
      end; 
     end; 
    end; 
end; 
format a b c d 4.1; 
run; 
+0

'想要的結果'是什麼? – Joe

+0

我的歉意。期望的結果是具有記錄的數據集,其中(a + b + c + d)= 1。例如,a = 0,b = 0,c = 0和d = 1不在數據集中。 – user3245869

回答

1

我不是很熟悉SAS,但總體上,當你有號碼,如0.1,它在二進制文件的表示。由於.1不能完全用二進制表示,所以數學方程並不總是完全相加。例如,在浮點運算中,0.1乘以10不等於1.0。通常,在使用浮點時不要使用相等性。

參見http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html

+0

謝謝韓。你對我的錯誤是正確的。 – user3245869

1

號碼在SAS被存儲在二進制(因爲它們是在大多數計算應用),並且常常不能精確地表示相應的十進制數。就像0.33333333!=(1/3)一樣,許多1/10也不代表它們的精確十進制值。

data data1; 

do a = 0.0 to 1.0 by 0.1; 
    do b = 0.0 to 1.0 by 0.1; 
     do c = 0.0 to 1.0 by 0.1; 
      do d = 0.0 to 1.0 by 0.1; 
       if round(a+b+c+d,.1)=1 then output; 
      end; 
     end; 
    end; 
end; 
format a b c d 4.1; 
run; 

舍入解決了這個問題。

有關更多信息,您可以閱讀this SAS technical paper

+0

謝謝喬。在我使用SAS的9年中,我從未遇到過這種情況。 – user3245869