Dapatkah seseorang menjelaskan hal ini (langsung dari dokumen - penekanan pada saya):
math.ceil (x) Mengembalikan langit-langit x sebagai float , nilai integer terkecil lebih besar dari atau sama dengan x.
math.floor (x) Kembalikan lantai x sebagai float , nilai integer terbesar kurang dari atau sama dengan x.
Mengapa .ceil
dan .floor
mengembalikan float ketika mereka secara definisi seharusnya menghitung bilangan bulat?
EDIT:
Nah ini punya beberapa argumen yang sangat baik mengapa mereka harus kembali mengapung, dan aku baru saja digunakan untuk ide, ketika @jcollado menunjukkan bahwa mereka sebenarnya melakukan int kembali di Python 3 ...
int(floor(n))
.Jawaban:
Kisaran angka floating point biasanya melebihi kisaran bilangan bulat. Dengan mengembalikan nilai floating point, fungsi dapat mengembalikan nilai masuk akal untuk nilai input yang berada di luar kisaran integer yang dapat diwakili.
Pertimbangkan: Jika
floor()
mengembalikan bilangan bulat, apa yang harusfloor(1.0e30)
dikembalikan?Sekarang, sementara bilangan bulat Python sekarang presisi yang sewenang-wenang, itu tidak selalu seperti ini. Fungsi pustaka standar adalah pembungkus tipis di sekitar fungsi pustaka C yang setara.
sumber
floor(float("inf"))
atauceil(float("nan"))
.Seperti yang ditunjukkan oleh jawaban lain, dalam python mereka mengembalikan float mungkin karena alasan historis untuk mencegah masalah meluap. Namun, mereka mengembalikan bilangan bulat dalam python 3.
Anda dapat menemukan informasi lebih lanjut di PEP 3141 .
sumber
float("inf")
ataufloat("nan")
, Anda akan mendapatkanOverflowError
pengecualian.numpy.floor
danceil
mengapung kembali (<class 'numpy.float64'>)float("inf")
tidak menghasilkan pengecualian dalam Python 2.7 atau 3Sumber kebingungan Anda jelas dalam komentar Anda:
Titik operasi langit-langit dan lantai adalah untuk membulatkan data titik-mengambang ke nilai integral . Tidak melakukan konversi tipe. Pengguna yang perlu mendapatkan nilai integer dapat melakukan konversi eksplisit setelah operasi.
Perhatikan bahwa tidak mungkin untuk menerapkan putaran ke nilai integral sepele jika semua yang Anda miliki adalah operasi langit-langit atau float yang mengembalikan bilangan bulat. Anda harus terlebih dahulu memeriksa apakah input berada dalam kisaran integer yang dapat diwakili, kemudian memanggil fungsinya; Anda perlu menangani NaN dan infinitas dalam jalur kode terpisah.
Selain itu, Anda harus memiliki versi langit-langit dan lantai yang mengembalikan angka floating-point jika Anda ingin menyesuaikan diri IEEE 754 .
sumber
Karena perpustakaan matematika python adalah pembungkus tipis di sekitar perpustakaan matematika C yang mengembalikan mengapung.
sumber
Sebelum Python 2.4, bilangan bulat tidak dapat menampung seluruh bilangan real terpotong.
http://docs.python.org/whatsnew/2.4.html#pep-237-unifying-long-integers-and-integers
sumber
Karena rentang untuk mengapung lebih besar daripada bilangan bulat - mengembalikan bilangan bulat bisa meluap
sumber
Ini pertanyaan yang sangat menarik! Karena float membutuhkan beberapa bit untuk menyimpan eksponen (=
bits_for_exponent
) angka floating point yang lebih besar daripada2**(float_size - bits_for_exponent)
selalu akan menjadi nilai integral! Pada ekstrem yang lain pelampung dengan eksponen negatif akan memberikan salah satu1
,0
atau-1
. Hal ini membuat pembahasan rentang integer versus float range dapat diperdebatkan karena fungsi-fungsi ini hanya akan mengembalikan nomor asli setiap kali nomor tersebut berada di luar kisaran tipe integer. Fungsi python adalah pembungkusC
fungsi dan jadi ini benar-benar kekuranganC
fungsi di mana mereka seharusnya mengembalikan integer dan memaksa programmer untuk melakukan range /NaN
/Inf
check sebelum memanggil ceil / floor.Dengan demikian jawaban logis adalah satu-satunya waktu fungsi ini berguna mereka akan mengembalikan nilai dalam rentang integer dan fakta bahwa mereka mengembalikan float adalah kesalahan dan Anda sangat pintar untuk mewujudkan ini!
sumber
Mungkin karena bahasa lain melakukan ini juga, jadi itu adalah perilaku yang diterima secara umum. (Untuk alasan yang baik, seperti yang ditunjukkan pada jawaban lain)
sumber