akqjqcjs7   3년 전

안녕하세요.

문제는 해결했습니다. 하지만 double에 관해 의문점이 생겼습니다.

처음에 풀때는 33번 줄을 dp[i] = round(m(array[i] * dp[i - 1], array[i]) * 1000) / 1000; 이렇게 했습니다.

이렇게 했던 이유는 계속 곱하다보면 소수점자리가 너무 커져 에러가 뜰까봐 소수3째 자리까지 잘라주면서 저장을 하려고 했습니다.

하지만 이렇게 하니까 틀리더군요. 그래서 질문 검색을 통해 다른분이 마지막 출력에 .3lf만하고 round는 필요 없다는 글을 보고

round를 없애고 출력을 하니 정답이 떳습니다.

제 의문점은 dp[i]를 계산 할때마다 소수점이 한칸 내려가다가 알아서 한계점에 도달하면 더 내려가지 않는건가요? 아니면 다른 이유가 있는지

궁금합니다.

bupjae   3년 전

다음 입력 데이터에 대해서

반올림 하지 않은 값은 1.449459 로, 맨 마지막에 한 번만 반올림 했다면 1.449 가 정답이지만

매 단계마다 반올림 한 것은 1.450 이 나옵니다.

   

double 은 오차 없이 표현할 수 있는 숫자의 개수 (= 유효숫자)가 15 입니다.  계산 결과가 유효숫자 15개를 넘어선다면 스스로 반올림합니다.

매 계산 단계마다 반올림을 하는 것은, 유효숫자를 스스로 4로 줄이는 것이 됩니다.

   

추가로, 이 프로그램은 n = 1 일때 잘못된 동작을 할 수 있습니다.

akqjqcjs7   3년 전

이 프로그램은 제 코드를 말씀하시는건가요?

double이 끝에가면 자동 반올림을 하는걸 몰라 일부러 반올림 했는데 그게 저렇게 될 거라곤 생각 못했습니다.. 자세하게 설명해주셔서 한번에 이해했습니다. 감사합니다.

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