python - numpy.nextafter () float에 추가하면 예기치 않은 결과가 반환됩니다.

출처 python numpy python-2.7 ieee-754

Wolfram Alpha에 따르면 이것은 x > 2에 해당됩니다.

6.0/(x+16) > 2.0/(x+4)


가능한 가장 작은 x를 얻으려면 numpy.nextafter()를 사용하고 있습니다.

>>> from numpy import nextafter
>>> x = nextafter(2,2+1)
>>> x
2.0000000000000004


하나.

>>> 6.0/(x+16) > 2.0/(x+4)
False


흥미롭게도.

>>> x+1
3.0000000000000004
>>> x+4
6.0


그렇다면이 경우에 실제 가능한 가장 작은 x > 2를 어떻게 구할 수 있습니까?
import numpy as np

x = 2.0
while True:
    if 6.0/(x+16) > 2.0/(x+4): break
    x = np.nextafter(x, x+1)   
print(repr(x))


수확량

2.0000000000000009




CPython에서 float를 처리하는 방법은 기본 C 라이브러리에 따라 다릅니다. 대부분의 C 라이브러리는 IEEE 754 Standard for Floating-Point Arithmetic를 구현합니다. 그러나 "IEEE 표준은 동일한 프로그램이 모든 준수 시스템에서 동일한 결과를 제공한다고 보장하지 않습니다." ( "모든 컴퓨터 과학자가 부동 소수점 산술에 대해 알아야 할 사항"(PDF) 및 PEP 754의 249 페이지 참조).

반복없이 x 값을 예측할 수 있으려면 부동 소수점 산술이 어떻게 수행되는지 (ibid (PDF)) 연구하고 x를 일반 바이너리 형식으로 기록해야합니다.



이것을 불평등으로 대체

6.0/(x+16) > 2.0/(x+4)


부동 소수점 산술 알고리즘을 추적하여 부등식을 충족하는 가장 작은 부동 소수점에 해당하는 숫자 dᵢ를 해결합니다.
관련 기사

python - 특수 문자를 고려하지 않고 대소 문자를 구분하지 않고 문자열 목록을 정렬하는 방법

python - 예외에서 루프를 종료하지만 모든 예외 유형을 다시 발생시키지 않는 방법은 무엇입니까?

python - Python에서 베어 함수 객체가 유효한 코드 인 이유는 무엇입니까? [닫은]

python - 최소 차 제곱합을 찾는 알고리즘

python - 한 번에 여러 파일 쓰기

python - Simplegui 가져 오기 문제

python - 파이썬의 백 슬래시 이스케이프 문자 이해

python - 지정된 바이트 오프셋에서 파일에서 행 가져 오기

python - REST API의 일반 (HTML이 아닌) 오류 페이지

python - 비 루트 사용자로서의 감독자 [닫힘]