> 백엔드 개발 > C++ > 부동 소수점 연산에서 0.1은 정확하게 표현되지 않는 반면 0.5는 정확하게 표현되는 이유는 무엇입니까?

부동 소수점 연산에서 0.1은 정확하게 표현되지 않는 반면 0.5는 정확하게 표현되는 이유는 무엇입니까?

Mary-Kate Olsen
풀어 주다: 2025-01-15 07:49:13
원래의
138명이 탐색했습니다.

Why is 0.1 not represented exactly in floating-point arithmetic, while 0.5 is?

부동 소수점 정밀도: 0.5는 정확하지만 0.1은 정확하지 않은 이유

부동 소수점 연산은 많은 계산에 효율적이지만 모든 십진수를 정확하게 표현하는 데는 본질적인 한계가 있습니다. 이 기사에서는 0.5에서는 정확한 표현이 가능한 반면 0.1에서는 그렇지 않은 이유를 살펴봅니다.

0.1의 표현 이해

IEEE 754 표준은 부동 소수점 숫자가 저장되는 방식을 규정합니다. 0.1의 표현을 살펴보겠습니다:

<code>s eeeeeeee mmmmmmmmmmmmmmmmmmmmmmm
0 01111011 10011001100110011001101</code>
로그인 후 복사
  • 부호(들): 0(양수).
  • 지수(eeeee): 123. 편향(127)을 빼면 -4의 유효 지수를 얻습니다.
  • 가수(mmmmmmmmmmmmmmmmmmmm): 암시적으로 앞에 "1"이 붙는 이진 분수로 해석됩니다. 가수 비트의 합은 약 1.60000002384185791015625입니다.

가수에 2-4를 곱하면 대략 0.100000001490116119384765625가 됩니다. 이는 0.1에 가까운 근사치이지만 정확히 일치하지는 않습니다. 이진수 표현의 본질적인 한계로 인해 십진수 0.1에서 완벽한 변환이 불가능합니다.

0.5의 정확한 표현

반면 0.5는 간단하게 표현됩니다.

<code>s eeeeeeee mmmmmmmmmmmmmmmmmmmmmmm
0 01111110 00000000000000000000000</code>
로그인 후 복사
  • 부호(들): 0(양수).
  • 지수(eeeee): 126. 유효 지수(바이어스 조정 후)는 -1입니다.
  • 가수(mmmmmmmmmmmmmmmmmmmm): 0.

이것은 1 * 2-1 = 0.5로 해석되며 완벽한 표현입니다.

결론: 이진 정밀도의 한계

차이점은 특정 소수점 이하 자릿수를 정확하게 표시하는 이진 시스템의 능력에 있습니다. 0.5(1/2)는 2의 거듭제곱이므로 이진수로 쉽게 표현되지만 0.1(1/10)은 그렇지 않습니다. 이로 인해 0.1을 부동 소수점 형식으로 저장할 때 약간의 반올림 오류가 발생하여 근사치가 관찰됩니다. 프로그래머는 부동 소수점 숫자 및 정밀도에 민감한 애플리케이션을 사용할 때 이러한 본질적인 한계를 염두에 두어야 합니다.

위 내용은 부동 소수점 연산에서 0.1은 정확하게 표현되지 않는 반면 0.5는 정확하게 표현되는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿