qktlf789456   2년 전

Convex Hull 을 구한 뒤 Convex Hull 의 각각의 변에 대해서 가장 먼 점까지의 거리를 구했고 각 변에 대해서 가장 먼 점이 최소인 것을 출력하도록 하였습니다.

다른 AC코드와 반례를 비교하는 프로그램을 짠 뒤 10만개이상을 비교했지만 반례가 나오지않았네요 ㅠ 맞고싶습니다 ㅠㅠ

byeongkeunahn   2년 전

일단 예제가 안 나오네요. 2.40 대신 2.41이 출력됩니다.

해결법은 생각보다 간단합니다.

97번째 줄에서 소수점 셋째자리 이하에 0이 아닌 수가 있는지 확인하려고 하셨는데요, 일반적으로 실수 연산을 할 때 0이 아닌지를 비교하려면 0과 비교하면 안 되고 아주 작은 "엡실론"과 비교하는 것이 정석입니다. 97번째 줄만 1e-12보다 큰지로 비교를 하도록 고치면 AC를 받을 수 있습니다.

메커니즘을 설명하자면 부동소수점 실수가 십진법이 아닌 이진법으로 표현되는 특성상 2.40과 가장 가까운 이진법 표현에서 2.40보다 아주 약간 컸을 것이고(아주 약간 작을 수도 있지만, 여기서는 운이 나쁩니다), 그 덕분에 97번째 줄은 해당 부동소수점 수를 올림해버리는 우를 범하게 되는 것입니다.

하지만 근본적으로 덜 골치아픈 방법은 부동소수점 연산을 아예 사용하지 않는 것입니다. 이 문제에서와 같이 절대/상대오차가 허용되지 않고 exact한 답을 구해야 하는 경우 우선 구하는 거리의 제곱을 분수꼴로 구하고, 여기에 100의 제곱인 10000을 곱해준 다음, 이분 탐색을 이용해 정수 수준에서 sqrt를 계산하는 방법이 가능합니다.

qktlf789456   2년 전

컴파일러마다 출력결과가 다른가봅니다 .. 그래서 예제가 계속 저는 2.40이 나온거같습니다.. 부동소수점문제를 항상 제 97번 라인으로 해결하였는데 다른환경에서는 틀릴수도 있군요... 많이 배워갑니다, 감사드립니다.

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