2014-01-28 2 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이 아닙니다. 일반적으로 부동 소수점으로 작업 할 때는 동등성을 사용하지 마십시오.

(그들은 대부분의 컴퓨팅 애플리케이션에로) SAS에서 http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html

+0

감사합니다. 내 실수에 대해 옳았 어. – user3245869

1

숫자가 이진에 저장되어보기, 종종 정확하게 십진수를 나타내는 것은 아니다. 0.33333333! = (1/3)과 똑같이 정확한 1/10을 나타내는 숫자는 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

관련 문제