한 원이 다른 원의 내부에 있고 두 원이 만나지 않을 때, 답은 0. 꼭 두 원의 중심이 같을 필요는 없습니다!
나머지 경우, 답은 2
6가지 경우를 모두 넣으셨으면, 반드시 각각의 경우가 모두 잘 나오는지 직접 테스트를 해 봅시다.
두 중심 사이 거리를 R이라고 할 때, 무턱대고 R == r1 + r2인지 검사하는 것은 매우 위험합니다. 세상의 모든 실수를 정확하게 저장하는 건 불가능하기 때문에, 컴퓨터는 약간의 오차가 생기는 방식으로 실수를 저장합니다. 예를 들어 0.1을 저장하는 것만으로 이미 10-18 정도의 오차가 발생합니다. 그런데 ==은 값이 조금이라도 다르면 거짓이기 때문에, R == r1 + r2가 실제로 성립하는 일은 많지 않습니다. 마찬가지로 r1, r2 등을 float, double 등의 자료형으로 저장하면 위험합니다.
R을 int 단위로 버림한 다음에
R == r1 + r2인지 검사해도 안 됩니다. 버림하는 순간 더 이상 거리가 아닙니다.
R2 == r12 + r22인지 검사해도 안 됩니다. 그 식이랑 R == r1 + r2는 매우 다른 식입니다.
R을 계산한 다음에 거기에 R을 곱해서 R2을 만들어도 안 됩니다. R을 계산한 순간 이미 오차가 생겼기 때문에 R2에도 오차가 생깁니다. 다행히도 R2을 오차 없이 계산하는 방법이 존재합니다. 힌트는 여기까지 드리겠습니다.
jh05013 4년 전 51
[2021년 12월 3일 수정: 3번을 조금 더 풀어서 설명했습니다.]