Czy ktoś może to wyjaśnić (prosto z dokumentacji - moje podkreślenie):
math.ceil (x) Zwraca pułap x jako liczbę zmiennoprzecinkową , czyli najmniejszą liczbę całkowitą większą lub równą x.
math.floor (x) Zwraca podłogę x jako liczbę zmiennoprzecinkową , czyli największą liczbę całkowitą mniejszą lub równą x.
Dlaczego .ceil
i .floor
zwracać liczby zmiennoprzecinkowe, skoro z definicji mają obliczać liczby całkowite?
EDYTOWAĆ:
Cóż to ma kilka bardzo dobrych argumentów, dlaczego oni powinni powrócić pływaków, a ja po prostu przyzwyczaić do myśli, kiedy @jcollado podkreślić, że w rzeczywistości zrobić ints powróci w Pythonie 3 ...
int(floor(n))
.Odpowiedzi:
Zakres liczb zmiennoprzecinkowych zwykle przekracza zakres liczb całkowitych. Zwracając wartość zmiennoprzecinkową, funkcje mogą zwracać sensowną wartość dla wartości wejściowych, które znajdują się poza możliwym do przedstawienia zakresem liczb całkowitych.
Zastanów się: jeśli
floor()
zwracana jest liczba całkowita, co powinnofloor(1.0e30)
zwrócić?Chociaż liczby całkowite w Pythonie mają teraz dowolną precyzję, nie zawsze tak było. Standardowe funkcje biblioteczne są cienkimi opakowaniami wokół równoważnych funkcji biblioteki C.
źródło
floor(float("inf"))
lubceil(float("nan"))
.Jak wskazano w innych odpowiedziach, w Pythonie zwracają zmienne prawdopodobnie z powodów historycznych, aby zapobiec problemom z przepełnieniem. Jednak zwracają liczby całkowite w Pythonie 3.
Więcej informacji można znaleźć w PEP 3141 .
źródło
float("inf")
lubfloat("nan")
, otrzymaszOverflowError
wyjątek.numpy.floor
iceil
return float (<class 'numpy.float64'>)float("inf")
nie tworzy wyjątku w Pythonie 2.7 lub 3Źródło twojego zamieszania jest ewidentne w twoim komentarzu:
Celem operacji na suficie i podłodze jest zaokrąglenie danych zmiennoprzecinkowych do wartości całkowitych . Nie robić konwersji typu. Użytkownicy, którzy muszą uzyskać wartości całkowite , mogą wykonać jawną konwersję po operacji.
Zauważ, że nie byłoby możliwe zaimplementowanie zaokrąglenia do wartości całkowitej w tak trywialny sposób, gdyby wszystko, co było dostępne, to operacja ceil lub float, która zwracała liczbę całkowitą. Najpierw musisz sprawdzić, czy dane wejściowe mieszczą się w reprezentowalnym zakresie liczb całkowitych, a następnie wywołaj funkcję; musiałbyś obsługiwać NaN i nieskończoności w oddzielnej ścieżce kodu.
Ponadto musisz mieć wersje ceil i floor, które zwracają liczby zmiennoprzecinkowe, jeśli chcesz zachować zgodność z IEEE 754 .
źródło
Ponieważ biblioteka matematyczna Pythona jest cienkim opakowaniem wokół biblioteki matematycznej C, która zwraca liczby zmiennoprzecinkowe.
źródło
Przed Pythonem 2.4 liczba całkowita nie mogła zawierać pełnego zakresu obciętych liczb rzeczywistych.
http://docs.python.org/whatsnew/2.4.html#pep-237-unifying-long-integers-and-integers
źródło
Ponieważ zakres liczb zmiennoprzecinkowych jest większy niż zakres liczb całkowitych, zwrócenie liczby całkowitej może spowodować przepełnienie
źródło
To bardzo interesujące pytanie! Ponieważ liczba zmiennoprzecinkowa wymaga pewnych bitów do przechowywania wykładnika (=
bits_for_exponent
), każda liczba zmiennoprzecinkowa większa niż2**(float_size - bits_for_exponent)
zawsze będzie wartością całkowitą! Na drugim biegunie pływak o wykładniku ujemnym dadzą jedną1
,0
lub-1
. To sprawia, że dyskusję o zakresie całkowitej kontra zakres pływak Moot ponieważ funkcje te będą po prostu wrócić oryginalny numer, gdy numer jest poza zakres typu całkowitego. Funkcje Pythona są opakowaniamiC
funkcji, więc jest to w rzeczywistości brakC
funkcji, w których powinny one zwrócić liczbę całkowitą i zmusić programistę do sprawdzenia zakresu /NaN
/Inf
przed wywołaniem ceil / floor.Zatem logiczną odpowiedzią jest jedyny przypadek, w którym te funkcje są użyteczne i zwracają wartość z zakresu liczb całkowitych, więc fakt, że zwracają wartość zmiennoprzecinkową, jest błędem i jesteś bardzo sprytny, aby to zrozumieć!
źródło
Może dlatego, że robią to również inne języki, więc jest to ogólnie akceptowane zachowanie. (Z ważnych powodów, jak pokazano w innych odpowiedziach)
źródło