[python] 파이썬의 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 에서 자세한 정보를 찾을 수 있습니다 .


답변

귀하의 의견에 혼란의 근원이 분명합니다.

ceil / floor 연산의 요점은 float를 정수로 변환하는 것입니다!

천장 및 바닥 작업의 요점은 부동 소수점 데이터를 정수 값 으로 반올림하는 것 입니다. 형식 변환을하지 마십시오. 정수 값 을 가져야하는 사용자 는 작업 후에 명시 적 변환을 수행 할 수 있습니다.

사용 가능한 모든 것이 정수를 리턴하는 ceil 또는 float 연산이면 사소한 정수로 반올림 값을 구현할 수 없습니다. 먼저 입력이 표현 가능한 정수 범위 내에 있는지 확인한 다음 함수를 호출해야합니다. 별도의 코드 경로에서 NaN 및 무한대를 처리해야합니다.

또한 IEEE 754 를 준수하려면 부동 소수점 숫자를 반환하는 ceil 및 floor 버전이 있어야합니다 .


답변

파이썬의 수학 라이브러리는 float를 반환하는 C 수학 라이브러리 주위의 얇은 래퍼이기 때문에.


답변

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)항상 정수 값 보다 큰 부동 소수점 숫자 입니다! 다른 극단적 인 경우 음의 지수를 가진 float는 다음 중 하나를 제공합니다 1.0 또는 -1. 이 논의하게 정수 범위플로트 범위 이러한 기능은 단순히 숫자가 외부 정수 유형의 범위 때마다 원래의 수를 반환하기 때문에 논쟁을. 파이썬 함수는 함수의 래퍼 C이므로 실제로 C정수를 반환하고 프로그래머가 ceil / floor를 호출하기 전에 범위 / NaN/ Inf검사 를 수행 해야하는 함수 의 결함입니다 .

따라서 논리적 인 대답은 이러한 함수가 유용 할 때 유일하게 정수 범위 내의 값을 반환하므로 부동 소수점을 반환한다는 사실은 실수 이며 이것을 실현하는 데 매우 똑똑합니다!