jlee4923   3년 전

밑에 두개의 코드가 있는데 한 줄만 다릅니다.

v-a가 v-b로 나누어떨어질때의 경우에 주목해 주세요.

d= (long int)((float)(v-a)/(a-b)+1)+1과 d= ((v-a)/(a-b)+1)+1 

전자가 포함된 코드의 결과가 틀렸다는 의미는 두 식이 서로 다른 의미라는 말이 되는데 

위 식에서 v-a, a-b의 순서쌍을 거의 천만쌍을 써서 출력값을 봐도 두 식의 값이 다르게 나오는 경우는 없는 것 같아서 질문 드립니다.

두 식이 어떤 점에서 다르고 왜 전자가 의도한 바와 다르게 출력되는지 알려주세요.

ori844acul   3년 전

이전 코드에서 이후 코드하고 다른 값을 보이는 반례를 하나 찾았는데 이를 통해서 이해해보시면 될 것 같습니다.

[Input]

9 1 1000000000

[기존코드]

125000001


[변경된코드]

125000000 (정답)

보시면 알겠지만 작은 값에선 문제가 없으나, 아주 큰 값에 대해선 미묘하게 차이가 나버리는 상황이 발생합니다.

이와 관련 된 논리오류를 추측해보자면 c에서의 강제형변환과 자동형변환이라는 내용에 대해 한번 고민해보면 좋을 것 같습니다.

아니면 단순하게 (float)(v-a)/(a-b)의 값과 (v-a)/(a-b)의 값에 대한 차이가 무엇인지를 생각해보시면 될 것 같습니다.

댓글을 작성하려면 로그인해야 합니다.