해당 문제 아래와 같이 작성하였고 VS2017에서 정답이 출력되는 것을 확인했는데 오답이라고 나와 어디서 잘못됐는지 여쭤보고 싶습니다.
------------------------------
float getDistance(struct Point2D p1, struct Point2D p2)
{
return sqrt(pow((p2.x - p1.x), 2) + pow((p2.y - p1.y), 2));
}
---------------------------------------
그리고 오답시 해설에서 함수의 반환형으로 double을 써야된다고 되어 있는데, ( 함수는 double getDistance(struct Point2D p1, struct Point2D p2)와 같이 만들어줍니다.)
심사문제의 printf에는 형식지정자로 %f가 있어 반환형이 double이 아닌 float이 되어야 되는 것 아닌지도 여쭤보고 싶습니다.
항상 도움에 감사드립니다.
pow 함수를 쓰지 말고 직접 계산하세요.
x = p2.x - p1.x;
로 계산하고
x*x로 쓰세요.
입력 값
11 22 77 88
직접 계산한 결과
93.338095
문의한 코드
93.338097
pow 함수의 해상도가 낮아서 부동소수점 계산에서 오차(rounding error)가 발생합니다.
Differences in rounded result when calling pow()
https://stackoverflow.com/questions/17063102/differences-in-rounded-result-when-calling-powpow() 함수를 호출했을 때 올림 결과에 차이가 발생하는 이유에 대한 질문이죠. 상세한 내용은 링크를 참고하세요.
rounding error가 없이 정확하게 계산하고 싶다면 직접 계산해야 합니다.
%lf 대신 %f로 출력해도 됩니다. 대신 출력하는 자릿수가 짧을 뿐입니다.
%f로는 유효자릿수 6개까지 다룹니다. pow() 함수의 내부 계산에서 숫자 처리의 해상도가 낮아서 6개 유효자릿수 조건도 만족하지 못하고 오차가 발생하는 것입니다.
단정도(single precision), 배정도(double precision)이란?
https://whatisthenext.tistory.com/146부동소수점수는 2진수로 실수를 표현하기 위한 방식이고, 이에 대해서는 컴퓨터 구조론에서 깊이 학습하게 됩니다. 일반적인 코딩 학습 과정에서는 신경 쓸 주제가 아닙니다. 부동소수점을 표기하는 IEEE 754와 부동소수점수 비트 계산은 컴퓨터 구조론 수업 시간에 반드시 나오고, 반드시 중간고사에 나오고, 반드시 싫어하거나 어려워하는 과목이니 미리 즐길(?) 필요는 없습니다. 가능하면 모르고 사는 게 좋습니다. 게임 프로그래밍이 아니면 대부분의 코딩에서는 정수형을 가장 많이 사용합니다.
심사문제 해설에서도 pow 함수 사용을 설명하지 않습니다. 가능하면 가이드를 따라주세요.