>백엔드 개발 >파이썬 튜토리얼 >Python에서 부동 소수점으로 표현될 때 일부 소수가 부정확하게 나타나는 이유는 무엇입니까?

Python에서 부동 소수점으로 표현될 때 일부 소수가 부정확하게 나타나는 이유는 무엇입니까?

Barbara Streisand
Barbara Streisand원래의
2024-12-06 02:20:14661검색

Why Do Some Decimal Numbers Appear Inaccurate When Represented as Floats in Python?

Python의 부동 소수점 숫자 반올림 오류: 수수께끼 풀기

수치 계산 영역에서 부동 소수점을 다루는 포인트 번호는 제한된 정밀도로 인해 문제가 될 수 있습니다. 매개변수 변형이 포함된 Python 스크립트를 실행하는 동안 예상치 못한 문제가 발생했습니다. 즉, 특정 델타 값(0.29 및 0.58)에 대한 결과가 없다는 것입니다. 면밀한 조사를 통해 근본적인 진실이 밝혀졌습니다. 즉, 특정 숫자를 부동 소수점으로 정확하게 표현하는 데 Python이 본질적으로 무능력하다는 것입니다.

이 현상을 보여주기 위해 다음 코드 조각은 정수 범위를 부동 소수점으로 변환하려고 시도합니다.

for i_delta in range(0, 101, 1):
  delta = float(i_delta) / 100

흥미롭게도 29 및 58과 같은 특정 정수의 경우 결과 부동 소수점 값은 (각각 0.2899999999999998 및 0.57999999999999996)은 예상되는 값(0.29 및 0.58)과 일치하지 않습니다. 이러한 불일치는 부동 소수점 산술의 근본적인 한계에 뿌리를 두고 있습니다.

모든 부동 소수점 시스템은 밑수, 지수 및 고정된 수의 유효 비트의 조합을 사용하여 실수의 근사치를 얻습니다. 특정 값, 특히 2의 거듭제곱으로 정확하게 표현할 수 없는 분수 부분이 있는 값은 본질적으로 정확하게 표현하기 어렵습니다. 결과적으로 이러한 값은 저장 및 계산 중에 반올림되거나 근사화됩니다.

이 반올림의 영향을 시각화하기 위해 실제 정수와 부동소수점 근사치 사이의 불일치를 보여주기 위해 Python 스크립트가 고안되었습니다.

import sys

n = int(sys.argv[1])

for i in range(0, n + 1):
  a = int(100 * (float(i) / 100))
  if i != a: print i, a

이러한 동작을 나타내는 숫자에는 식별할 수 있는 패턴이 없는 것처럼 보이지만 기본 원칙은 동일하게 유지됩니다. 정확한 2의 거듭제곱은 부동 소수점으로 저장될 때 근사화될 가능성이 있습니다.

부동 소수점 산술의 복잡성과 컴퓨팅 결과에 대해 더 자세히 알아보려면 "모든 컴퓨터 과학자가 알아야 할 사항"과 같은 리소스를 살펴보세요. 부동 소수점 연산'을 적극 권장합니다. 이러한 미묘한 차이를 이해하는 것은 수치 분석의 함정을 탐색하고 계산의 정확성을 보장하는 데 매우 중요합니다.

위 내용은 Python에서 부동 소수점으로 표현될 때 일부 소수가 부정확하게 나타나는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.