2011-09-30 39 views
2

看來我有一個舍入問題SAS PROC FORMAT。代碼如下:似乎我有一個舍入問題SAS PROC格式

proc format; value testf -1.85E-13--1.85E-13 ='negative' 0-0 ='zero'; 跑;

數據測試; 輸入數字best32 .; 卡; ; 跑;

data test2; 設置測試; format varlabel $ 50 .; varlabel = put(number,testf。); 跑;代碼很簡單:首先,創建一個格式,帶有兩個選項,一個負數真的接近零和零。其次,創建數據集測試,其中數字變量等於0的單個觀察值。第三,使用應用格式創建另一個數據集。我期望看到test2的number = 0和varlabel ='zero',但實際上我看到test2的number = 0和varlabel ='negative'。任何人都知道爲什麼以及如何解決這個問題?非常感謝任何建議/幫助。

回答

5

這是一個浮點精度問題。當測試相等的浮點值時,SAS採用1e-12的「模糊」值(默認情況下)。如果abs(a-b)< 1e-12,則表達式a = b的計算結果爲真。在你的情況下,1.85e-13足夠接近零,SAS會給它格式'負面'(爲什麼它總是指定這個,而從不'零'我不知道)。處理這種

一種方法是減少您的格式絨毛值SAS同事:

proc format; 
    value testf (fuzz=1E-13) -1.85E-13--1.85E-13 = 'negative' 0-0 = 'zero'; 
run; 

這種格式分配預期varlabel「零」。

如果這種事情對您來說是一個實際問題,您可能需要仔細考慮代碼中潛在的數字精度問題,因爲它們能夠在錯誤中產生一些令人討厭且難以察覺的錯誤情況。

This link給出了SAS中數值表示問題的一些信息,這些信息可能會有幫助。