tori1753   2년 전

7.84나 8.12와 같이 소수 둘째점 자리까지 있는 실수값들에 일괄적으로 *100.0을 하고 int 캐스팅하여 784와 812와 같은 정수형으로 값을 다루려고 합니다.

이를 위하여 모든 값에 일괄적으로 *100.0을 해주었는데, 해당 문제에서 틀렸습니다를 받았습니다.

약간 검색을 해보니 *100.0을 해준뒤에 +0.5를 하고나서 int cast를 해야 해결되는 문제라고 합니다.

C언어 데이터 타입에 대해서 골똘히 생각해보아도 왜 이렇게 해야하는지 이해할 수 없었습니다.

제가 아는 지식선에서는 *100.0울해도 데이터손실이나 변형이 전혀 일어날 것 같지 않았습니다.

게다가 어떤 원리로 +0.5가 되면 이 손실이나 변형이 보정되는지도 이해되지 않았습니다.

가르침부탁드립니다.

질문

1. 7.81와 같은 double데이터에 *100.0을 하면 데이터 손실이나 변형이 왜 일어나는지?

2. 1번과 같은 경우에서 일괄적으로 +0.5를 하면 이 손실과 변형이 보정된다는데 왜그러는지?

index   2년 전

N / (2의 거듭제곱)의 꼴로 나타낼 수 없는 모든 실수는 정확하게 표현되지 않아서 그래요.

int로 바꿀 땐 소숫점 아래를 버리는데 대부분은 정확히 나오지만 0.29같은 몇몇 수들이 100을 곱하면 28.999999... 이런 식으로 자연수보다 살짝 작게 나와서 이런걸 방지하려고 적당한 작은 수를 더해서 소숫점 아래를 버림해도 문제 없도록 하는거에요.

kdh6429   2년 전

컴퓨터의 2진수 체계로 10진수의 소수점을 표현하는 방식에서 오는 오차입니다. rounding error 로 검색해 보시면 설명해놓은 글들이 있을것 같네요.

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