파이썬의 math.ceil () 및 math.floor () 연산이 정수 대신 부동 소수점을 반환하는 이유는 무엇입니까?
누군가 이것을 설명 할 수 있습니까 ( 문서와 직선 -강조 광산).
math.ceil (x) x의 상한값 을 x 보다 크거나 같은 가장 작은 정수 값인 float로 반환합니다 .
math.floor (x) x 의 플로어를 x 보다 작거나 같은 가장 큰 정수 값인 float로 반환합니다 .
왜 것 .ceil
그리고 .floor
그들은 정의에 의해 계산 정수로 가정된다 반환 수레 때?
편집하다:
그럼이 그들이 이유에 아주 좋은 인수를 가지고 있어야 수레를 반환 할 때, 그리고 난 그냥, 생각에 익숙해되었다 @jcollado은 그들이 실제로 지적 할 파이썬 3에서 반환하는 int를 ...
부동 소수점 숫자의 범위는 일반적으로 정수 범위를 초과합니다. 부동 소수점 값을 반환함으로써 함수는 표현 가능한 정수 범위를 벗어난 입력 값에 대한 합리적인 값을 반환 할 수 있습니다.
고려 : floor()
정수를 반환하면 무엇을 floor(1.0e30)
반환 해야 합니까?
이제 파이썬의 정수는 이제 임의의 정밀도이지만 항상 그런 것은 아닙니다. 표준 라이브러리 함수는 동등한 C 라이브러리 함수를 둘러싼 얇은 래퍼입니다.
다른 답변에서 지적했듯이 파이썬에서는 오버플로 문제를 방지하는 역사적인 이유로 인해 부동 소수점을 반환합니다. 그러나 파이썬 3에서는 정수를 반환합니다.
>>> import math
>>> type(math.floor(3.1))
<class 'int'>
>>> type(math.ceil(3.1))
<class 'int'>
PEP 3141 에서 자세한 정보를 찾을 수 있습니다 .
파이썬의 수학 라이브러리는 float를 반환하는 C 수학 라이브러리 주위의 얇은 래퍼이기 때문에.
귀하의 의견에 혼란의 근원이 분명합니다.
ceil / floor 연산의 요점은 float를 정수로 변환하는 것입니다!
천장 및 바닥 작업의 요점은 부동 소수점 데이터를 정수 값 으로 반올림하는 것 입니다. 형식 변환을하지 마십시오. 정수 값 을 가져야하는 사용자 는 작업 후에 명시 적 변환을 수행 할 수 있습니다.
사용 가능한 모든 것이 정수를 리턴하는 ceil 또는 float 연산이면 사소한 정수로 반올림 값을 구현할 수 없습니다. 먼저 입력이 표현 가능한 정수 범위 내에 있는지 확인한 다음 함수를 호출해야합니다. 별도의 코드 경로에서 NaN 및 무한대를 처리해야합니다.
또한 IEEE 754 를 준수하려면 부동 소수점 숫자를 반환하는 ceil 및 floor 버전이 있어야합니다 .
Python 2.4 이전에는 정수가 잘린 실수의 전체 범위를 보유 할 수 없었습니다.
http://docs.python.org/whatsnew/2.4.html#pep-237-unifying-long-integers-and-integers
float의 범위가 정수의 범위보다 크기 때문에 정수를 반환하면 오버플로가 발생할 수 있습니다
이것은 매우 흥미로운 질문입니다! 부동 소수점은 지수 (= bits_for_exponent
) 를 저장하기 위해 약간의 비트가 필요하므로 2**(float_size - bits_for_exponent)
항상 정수 값 보다 큰 부동 소수점 숫자 입니다! 다른 극단에서 제외 지수와 플로트의 한 줄 것 1
, 0
또는 -1
. 이 논의하게 정수 범위 대 플로트 범위 이러한 기능은 단순히 숫자가 외부 정수 유형의 범위 때마다 원래의 수를 반환하기 때문에 논쟁을. 파이썬 함수는 함수의 래퍼 C
이므로 실제로 C
정수를 반환하고 프로그래머가 ceil / floor를 호출하기 전에 범위 / NaN
/ Inf
검사 를 수행 해야하는 함수 의 결함입니다 .
따라서 논리적 인 대답은 이러한 함수가 유용한 유일한 시간이며 정수 범위 내의 값을 반환하므로 부동 소수점을 반환한다는 사실은 실수 이며 이것을 실현하는 데 매우 영리합니다!
다른 언어도이 작업을 수행하기 때문에 일반적으로 허용되는 동작입니다. (다른 답변에서 볼 수 있듯이 좋은 이유로)
'IT' 카테고리의 다른 글
파일 포인터 (FILE * fp)를 파일 디스크립터 (int fd)로 어떻게 변환 할 수 있습니까? (0) | 2020.06.02 |
---|---|
Docker 컨테이너 이미지가 왜 그렇게 큰가요? (0) | 2020.06.02 |
디렉토리 또는 파일이있는 마운트 / 파티션을 찾는 방법은 무엇입니까? (0) | 2020.06.02 |
파이썬에서 여러 줄로 된 dict을 형식화하는 올바른 방법은 무엇입니까? (0) | 2020.06.02 |
하위 프로세스 Popen과 call의 차이점은 무엇입니까 (어떻게 사용할 수 있습니까)? (0) | 2020.06.02 |