모든 정수 값이 Double로 완벽하게 표현됩니까?
모든 정수 값이 다음과 같이 완벽하게 표현되는지에 대한 의문이 생깁니다. 배정밀도 부동 소수점 숫자. 이에 답하기 위해 먼저 복식 표현에 대해 자세히 알아봅니다.
복식은 가수 * 2^지수로 표현되며, 여기서 가수에는 분수가 포함됩니다. 이를 통해 정수 값과 소수 값을 모두 표현할 수 있습니다.
32비트 정수 표현
32비트 정수의 경우 최대 53비트를 사용할 수 있습니다. 가수. 이는 분수 손실 없이 가능한 모든 32비트 정수를 표현하는 데 충분합니다. 따라서 모든 32비트 정수 값은 완벽하게 double로 표현됩니다.
64비트 정수의 표현
그러나 64비트 정수의 경우 상황은 다르다. IEEE 754 배정밀도는 최대 53비트까지 완벽한 표현을 보장할 수 있습니다. 그 외에도 반올림 오류가 있을 수 있습니다. 따라서 아니요, 모든 64비트 정수 값이 double로 완벽하게 표현되는 것은 아닙니다.
경험적으로 동작 확인
다음 코드 조각은 정수를 double로 변환하는 것을 테스트합니다. :
<code class="cpp">#include <iostream> #include <limits> using namespace std; int main() { double test; volatile int test_int; for (int i = 0; i < numeric_limits<int>::max(); i++) { test = i; test_int = test; if (test_int != i) cout << "found integer i=" << i << ", test=" << test << endl; } return 0; }</code>
이 코드를 실행하면 32비트 정수에 대한 분수 변환 오류가 있는 정수 값이 없음을 알 수 있습니다. 그러나 64비트 정수의 경우 분수 차이를 사용하여 double로 변환하고 다시 원래 정수 값으로 반올림하는 정수 값을 찾을 수 있습니다.
소수 차이
변환 중 분수 차이가 발생할 가능성에 대해 정수에 대한 대답은 여전히 '아니오'입니다. 이는 가수 * 2^지수로 표시되는 double 값 사이의 단계 폭이 항상 2의 거듭제곱이기 때문입니다. 따라서 두 double 값 사이에 2보다 작은 차이가 발생하지 않아 반올림 문제가 해결됩니다.
위 내용은 모든 정수 값을 Double로 완벽하게 표현할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!