2009-06-26 3 views
8

저는 MATLAB 초보자입니다. 여기에 문제가 있습니다 :MATLAB - 층 질문

>> a = floor(7/2.5) 

a = 

     2.00 

>> b = rem(7,2.5) 

b = 

     2.00 

>> c = floor(b/2) 

c = 

     0 

c는 1이어야합니다. 왜 0입니까?

>> b = 2 

b = 

     2.00 

>> c = floor(b/2) 

c = 

     1.00 

답변

11

두 단어 : 절단 오류를 다음과 같이 B = 2에 직접 입력 될 때

이 다르다.

맞습니다. C는 정확한 산술에서 1.0이어야합니다. 그러나, rem의 인수에 float를 사용 했으므로, 그 답을 float으로 얻습니다. 분명히 b는 정확히 2가 아니지만 2.0이므로 2에 매우 가까운 double이라는 것을 의미합니다. 따라서 b/2는 double 1.0이됩니다.이 경우 분명히 그 값은 1보다 약간 작아서 0을줍니다. 정수 값 이를 막으려면 floor와 ceil을 모두 사용하고 값을 비교하십시오.

답을 정수로 변환하려면 바닥 대신 둥근을 사용하십시오.

+0

고마워요. 나는 rem 함수의 결과를 하나의 것으로 변환했다. 그럼, 적어도 내 문제가 해결되었습니다. –

+0

rem의 결과를 int로 변환합니다. – KitsuneYMG

+2

"정수로 변환"용어에주의하십시오. round는 정수 유형으로 변환되지 않고 가장 가까운 정수 값을 반환하지만 여전히 double 값을 반환합니다. 이것은 보통 당신이 원하는 것입니다. int32와 같은 실제 Matlab 정수 유형은 double보다 높은 우선 순위를 가지며 정수 연산으로 모든 후속 연산을 수행합니다. –

6

당신이 당신의 예에 라인을

d = b-a 

를 추가 할 경우 결과를 볼 수 있습니다

d = 

-4.4409e-016 

의미 matlab에 가까이에 수를 계산하지만, 정확히, B 2. 이것은 부동 소수점 숫자로 작업 할 때 상당히 유용합니다. 더 많은 정보를 원하시면

help eps 

보십시오. 이런 종류의

+0

팁 주셔서 감사합니다. –

0

에 그래 그 수치 문제가 다루어진다. 그런 것들을주의해서 사용해야합니다. 정확한 산술을 원하면 숫자에 'sym'을 사용해야합니다.

b=rem(sym(7),sym(2.5)) 

그런 오류는 없지만 계산 속도가 훨씬 느립니다.