파이썬에서는 플로트의 범위 값은 구현 및 플랫폼에 따라 다릅니다. Python 언어 사양에는 다음 사항만 필요합니다. 부동 소수점 숫자는 적어도 지원합니다 1e-308 에게 1e+308 최소한의 정밀도로 53비트 .
실제로 대부분의 최신 Python 구현에서는 다음을 사용합니다. IEEE 754 대략적인 범위를 제공하는 부동 소수점 표준 1.7e-308 에게 1.7e+308 정밀도로 53비트 . 이 범위는 모든 플랫폼에서 동일하며 float 내장 유형에서 지원됩니다.
그러나 부동 소수점 산술은 반올림 오류 및 기타 부정확성의 원인이 될 수 있으며, 특히 매우 크거나 매우 작은 숫자에 대한 연산을 수행할 때 유의해야 합니다. 경우에 따라 예상치 못한 동작과 버그가 발생할 수 있습니다.
이러한 문제를 방지하려면 다음을 사용하는 것이 좋습니다. 소수 또는 고정 소수점 금전적 가치나 높은 정밀도가 필요한 기타 응용 프로그램을 사용할 때 산술을 수행합니다. 그만큼 십진수 모듈 Python에서는 구성 가능한 정밀도로 고정 소수점 산술을 지원하며 이러한 응용 프로그램에 대한 부동 소수점 산술의 좋은 대안입니다.
스파크 튜토리얼
그만큼 IEEE 754 표준은 Python을 포함한 대부분의 최신 프로그래밍 언어에서 사용되는 부동 소수점 숫자의 범위와 정밀도를 정의합니다. 표준은 부동 소수점 숫자에 대한 두 가지 기본 형식을 정의합니다.
그것은 사용한다 32비트 그리고 대략적으로 제공합니다 소수점 7자리 정밀도의 자릿수.
그것은 사용한다 64비트 그리고 대략적으로 제공합니다 십진수 16자리 정밀도의 자릿수.
파이썬은 배정밀도 기본적으로 부동 소수점 숫자입니다. 즉, 부동 소수점 값의 범위는 대략 다음과 같습니다. 1.7e-308 에게 1.7e+308 정밀도로 53비트 . 이 범위는 다음을 사용하여 표현할 수 있는 최대 및 최소 지수에 의해 결정됩니다. 11비트 , 다음을 사용하여 표현할 수 있는 최대 및 최소 유효 숫자(즉, 숫자의 분수 부분)와 결합됩니다. 52비트 .
부동 소수점 연산의 실제 정밀도는 숫자가 메모리에 저장되는 방식, 연산 순서, 반올림 모드 선택 등 다양한 요소의 영향을 받을 수 있습니다. 경우에 따라 미묘한 반올림 오류 및 기타 부정확한 원인이 발생할 수 있습니다.
이러한 문제를 방지하려면 매우 크거나 작은 숫자로 작업할 때 또는 높은 정밀도가 필요할 때 대체 접근 방식을 사용하는 것이 좋습니다. 예를 들어:
- 사용 고정 소수점 연산 또는 십진수 산술 , 고정된 소수 자릿수를 제공하고 반올림 오류를 방지합니다.
- 사용 임의 정밀도 같은 도서관 'mpmath' 또는 'gmpy2' , 매우 높은 정밀도로 계산을 수행하고 반올림 오류를 방지할 수 있습니다.
주목해야 할 한 가지 중요한 측면은 Python에서 부동 소수점 숫자에 대한 산술 연산을 수행할 때 부동 소수점 산술 작동 방식으로 인해 예상치 못한 동작이 발생할 수 있다는 것입니다.
일부 산술 연산에서는 부동 소수점 산술을 사용하여 정확하게 표현할 수 없는 매우 작거나 매우 큰 숫자가 발생할 수 있습니다. 이러한 경우 결과는 다음과 같습니다. 둥근 또는 잘린 , 예상치 못한 동작이 발생하거나 계산이 부정확해질 수 있습니다.
부동 소수점 연산 아니다 연관 즉, 작업을 수행하는 순서가 결과에 영향을 미칠 수 있음을 의미합니다. 예를 들어, (a + b) + c 같지 않을 수도 있습니다 a + (b + c) 반올림 오류 및 기타 부정확한 원인으로 인해 발생합니다.
부동 소수점 연산도 그렇지 않습니다. 분배적인 , 의미하는 것은 (a + b) * c 같지 않을 수도 있습니다 a * c + b * c 반올림 오류 및 기타 부정확한 원인으로 인해 발생합니다. 이러한 문제의 영향을 최소화하려면 보다 정확하고 안정적인 방식으로 부동 소수점 숫자에 대한 산술 연산을 수행하는 기능을 제공하는 수학 모듈이나 기타 수치 라이브러리를 사용하는 것이 좋습니다. 또한 부동 소수점 숫자가 같은지 비교하는 것을 피하고 대신 두 값 사이의 차이 크기를 비교하기 위해 공차 임계값이나 다른 방법을 사용하는 것도 좋은 방법입니다.
예:
방법을 보여주기 위해 예를 들어 보겠습니다. 부동 소수점 연산 Python에서 예기치 않은 동작이 발생할 수 있습니다.
a = 0.1 b = 0.2 c = 0.3 result1 = (a + b) + c result2 = a + (b + c) print(result1) print(result2)
산출:
0.6000000000000001 0.6
설명:
이 예에서는 동일한 값을 사용하여 두 가지 다른 계산을 수행합니다. 에, 비, 그리고 씨 . 첫 번째 계산에서는 다음을 더합니다. ㅏ 그리고 비 먼저 결과를 추가한 다음 씨 . 두 번째 계산에서는 다음을 더합니다. 비 그리고 씨 먼저 결과를 추가한 다음 ㅏ .
두 계산이 동일한 값을 사용하므로 동일한 결과가 나올 것으로 예상할 수 있습니다. 에, 비 , 그리고 씨 . 그러나 부동 소수점 연산의 한계로 인해 두 계산은 약간 다른 결과를 생성합니다.
첫 번째 계산의 결과는 다음과 같습니다. 0.6000000000000001 , 두 번째 계산의 결과는 다음과 같습니다. 0.6 . 반올림 오류 및 기타 부정확성 원인으로 인해 첫 번째 계산의 중간 결과가 두 번째 계산의 중간 결과와 약간 다르기 때문입니다.
이러한 문제를 방지하려면 다음을 사용하는 것이 좋습니다. 십진수 모듈 또는 다른 수행 방법 산술 연산 ~에 부동 소수점 더 정확하고 신뢰할 수 있는 방식으로 숫자를 계산합니다.
예를 들어:
import decimal a = decimal.Decimal('0.1') b = decimal.Decimal('0.2') c = decimal.Decimal('0.3') result1 = (a + b) + c result2 = a + (b + c) print(result1) print(result2)
산출:
0.6 0.6
설명:
이 예에서는 십진수 모듈 다음을 사용하여 동일한 계산을 수행합니다. 고정 소수점 정밀도가 높은 산술 1 소수점. 이를 통해 영향을 미칠 수 있는 반올림 오류 및 기타 부정확성의 원인을 피할 수 있습니다. 부동 소수점 산수. 결과적으로 두 계산 모두 동일한 결과를 생성합니다. 0.6 .