kaowltus12   1년 전

마지막 출력값, long double, double사이의 형변환 에 대한 질문입니다.

문제에서 사용되는 모든 변수에 대해 통일된 자료형을 사용하면(long double만 사용 or double만 사용)

정답이 나옵니다.


그런데 하나라도 중간에 자료형을 섞어쓰게된다면 오답이 나옵니다.

이에 대한 문제 해결로

글 읽기 - long double와 double의 차이점? (acmicpc.net)

해당 게시글을 읽어 보았는데, 제가 이해한 바가 맞다면 위의 약식 코드대로 정상적으로 형변환을 진행하고 출력하면 정답이 나오지 않을까 싶었습니다.

그런데 오답이 나왔습니다. long double에서 double로 형변환을 한 것도 아닌데(큰 범위->작은범위) 어째서 둘 사이에 차이가 발생하는지 궁금합니다.

둘다 부동소수점 방식을 채택하고, 표현 범위만 다를 뿐인데 말이죠.

myungwoo   1년 전

올려주신 내용만 봤을 때는 특이한 상황이네요. 첨부된 코드 말고 맞은 코드와 틀린 코드를 둘다 보고 비교해야 이유를 생각해볼 수 있을 것 같습니다.

그리고 참고로, 2166번 문제는 실수 자료형을 사용하지 않고 풀이 가능합니다.

결국 출력해야 하는 답은 "정수/2"이라 xxxxx.0 혹은 xxxxx.5 입니다.
실수 자료형는 내부에서 어떤 일이 돌아가는지 완벽하게 이해할 수 없으므로, 실수 자료형 사용을 최대한 피하는 것이 좋습니다.

kaowltus12   1년 전

와... 저렇게도 풀이가 가능하네요... 새롭게 알아갑니다. 감사합니다!

그리고 제가 풀이한 코드를 질문에 올려도 되는걸까요? 그걸 잘 모르겠어서 일부만 올렸습니다.

myungwoo   1년 전

저도 BOJ에 대해 잘 아는 편이 아니라 잘 모르겠습니다.

kaowltus12   1년 전

해당 코드가 오류 코드입니다.

kaowltus12   1년 전

해당 코드가 정답 통과된 코드입니다.

맨 마지막 형변환 부분만 차이가 있습니다.

딱히 공지에 올려선 안된다는 얘기가 없어서 올려봅니다!

myungwoo   1년 전

https://www.diffchecker.com/46FdlHNe

long double을 사용한 것 말고도 차이가 있네요. 틀린 코드에서 입력을 %lf로 받으면 맞습니다.

C, C++에서 scanf로 double을 입력 받기 위해서는 %f가 아닌 %lf가 필요합니다.
그리고 printf에서 double을 출력할 때는 %f로 해도 됩니다. (%lf도 되는 걸로 알고 있습니다)

참고 자료: scanfprintf

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