Kita semua tahu 0/0
adalah Undefined
dan kembali kesalahan jika saya memasukkannya ke dalam kalkulator, dan jika saya ingin membuat sebuah program (dalam bahasa C setidaknya) OS akan menghentikan hal itu ketika saya mencoba untuk membagi dengan nol.
Tapi apa yang saya've telah bertanya-tanya jika komputer bahkan mencoba untuk membagi dengan nol, atau apakah itu hanya memiliki "dibangun dalam perlindungan", sehingga ketika itu, "melihat" 0/0
itu kembali kesalahan bahkan sebelum mencoba untuk menghitung itu?
CPU telah dibangun di deteksi. Kebanyakan set instruksi arsitektur menentukan bahwa CPU akan menjebak ke handler pengecualian untuk membagi bilangan bulat dengan nol (I don't pikir itu peduli jika dividen adalah nol).
Adalah mungkin bahwa cek untuk pembagi nol terjadi secara paralel di hardware seiring dengan upaya untuk melakukan pembagian, namun, deteksi menyinggung kondisi secara efektif membatalkan pembagian dan perangkap sebaliknya, sehingga kita bisa't benar-benar tahu jika beberapa bagian dari itu berusaha divisi atau tidak.
(Hardware sering bekerja seperti itu, lakukan beberapa hal secara paralel dan kemudian memilih hasil yang sesuai karena setelah itu kemudian masing-masing operasi semua dapat segera memulai bukan dari serialisasi pada pilihan yang sesuai operasi.)
Perangkap yang sama untuk pengecualian mekanisme ini juga akan digunakan ketika meluap deteksi diaktifkan, yang anda minta biasanya dengan menggunakan berbagai add/sub/mul instruksi (atau bendera pada instruksi tersebut).
Floating point division juga telah dibangun di deteksi untuk membagi dengan nol, tetapi mengembalikan nilai yang berbeda (IEEE 754 menentukan NaN), bukan menjebak ke handler pengecualian.
Secara umum, jika CPU dihilangkan apapun deteksi untuk mencoba untuk membagi dengan nol, masalah bisa meliputi:
Hal ini tergantung pada bahasa, pada compiler, pada apakah anda menggunakan bilangan bulat atau angka floating point, dan sebagainya.
Untuk angka floating point, sebagian besar implementasi menggunakan IEEE 754 standar, di mana pembagian dengan 0 didefinisikan dengan baik. 0 / 0 memberikan didefinisikan dengan baik hasil dari NaN (not-a-number), dan x / 0 untuk x ≠ 0 memberikan baik +tak Terhingga atau tak Terhingga, tergantung pada tanda x.
Dalam bahasa seperti C, C++ dll. pembagian dengan nol memanggil perilaku tidak terdefinisi. Jadi menurut definisi bahasa, anything bisa terjadi. Terutama hal-hal yang anda don't ingin terjadi. Seperti semuanya bekerja baik-baik saja ketika anda menulis kode, dan menghancurkan data ketika pelanggan anda menggunakannya. Sehingga dari bahasa pandang, _don't do this. Beberapa bahasa guarantee bahwa aplikasi anda akan crash; it's sampai kepada mereka bagaimana hal ini dilaksanakan. Untuk bahasa-bahasa tersebut, pembagian dengan nol akan crash.
Banyak prosesor memiliki beberapa jenis built-in "membagi" instruksi, yang akan berperilaku berbeda tergantung pada prosesor. Pada Intel 32 bit dan 64 bit prosesor, "membagi" petunjuk yang akan crash aplikasi anda ketika anda mencoba untuk membagi dengan nol. Prosesor lain yang mungkin berperilaku berbeda.
Jika compiler mendeteksi bahwa pembagian dengan nol akan terjadi ketika anda mengeksekusi beberapa kode, dan compiler yang bagus untuk penggunanya, kemungkinan akan memberikan anda peringatan, dan menghasilkan built-in "membagi" instruksi sehingga perilaku yang sama.
Sepertinya anda're-tanya apa yang akan terjadi jika seseorang membuat sebuah CPU yang doesn't secara eksplisit memeriksa nol sebelum membagi. Apa yang akan terjadi sepenuhnya tergantung pada pelaksanaan pembagian. Tanpa pergi ke rincian, salah satu jenis implementasi akan menghasilkan hasil yang memiliki semua bit diatur, misalnya 65535 pada 16-bit CPU. Yang lain mungkin hang up.
Tapi apa yang saya've telah bertanya-tanya jika komputer bahkan mencoba untuk membagi dengan nol, atau apakah itu hanya memiliki "dibangun dalam perlindungan", sehingga ketika itu, "melihat" 0/0 itu kembali kesalahan bahkan sebelum mencoba untuk menghitung itu?
Sejak x/0
tidak masuk akal, periode, komputer harus selalu memeriksa untuk pembagian dengan nol. Ada's masalah berikut: Programmer ingin menghitung (a+b)/c
tanpa harus repot-repot untuk memeriksa apakah perhitungan yang masuk akal. Di bawah-the-hood tanggapan untuk pembagian dengan nol oleh CPU + jumlah + jenis sistem operasi + bahasa yang lebih baik untuk melakukan sesuatu yang agak drastis (misalnya, crash program) atau melakukan sesuatu yang terlalu jinak (misalnya, menciptakan nilai yang tidak masuk akal seperti IEEE floating point NaN
, sebuah nomor yang "Bukan Nomor").
Dalam pengaturan biasa, seorang programmer yang diharapkan adalah mengetahui apakah (a+b)/c
masuk akal. Dalam konteks ini, ada's tidak ada alasan untuk memeriksa untuk pembagian dengan nol. Jika pembagian dengan nol tidak terjadi, dan jika bahasa mesin + implementasi bahasa + data + jenis sistem operasi respon ini adalah untuk membuat program yang crash, yang's baik-baik saja. Jika respon adalah untuk menciptakan nilai yang mungkin pada akhirnya akan mencemari setiap nomor dalam program ini, yang's baik-baik saja, terlalu.
Tidak "sesuatu yang drastis" atau "terlalu jinak" ini adalah hal yang benar untuk dilakukan di dunia keandalan yang tinggi komputasi. Mereka default tanggapan mungkin membunuh pasien, kecelakaan pesawat, atau membuat sebuah bom meledak di tempat yang salah. Tinggi keandalan lingkungan, seorang programmer yang menulis (a+b)/c
akan memilih untuk mati selama code review, atau di zaman modern, mungkin memilih untuk mati secara otomatis oleh alat yang memeriksa terlarang konstruksi. Dalam lingkungan ini, programmer yang malah harus telah menulis sesuatu di sepanjang baris dari div(add(a,b),c)
(dan mungkin beberapa memeriksa status kesalahan). Di bawah kap mesin, div
(dan juga add
) fungsi/macro melindungi terhadap pembagian dengan nol (atau overflow dalam kasus add
). Apa yang memerlukan perlindungan ini sangat implementasi tertentu.
Kita tahu sekarang bahwa x/0
dan 0/0
tidak memiliki didefinisikan dengan baik jawaban. Apa yang terjadi jika anda mencoba untuk menghitung 0/0
sih?
Pada sistem modern, perhitungan diteruskan ke MPU dalam CPU dan ditandai sebagai sebuah operasi ilegal, kembali NaN
.
Pada banyak sistem yang lebih tua, seperti 'tahun 80-an komputer rumah yang tidak memiliki on-chip pembagian, perhitungan dilakukan dengan perangkat lunak apa pun yang sedang berjalan. Ada beberapa pilihan yang mungkin:
0
1
log(0)
dan perangkat lunak akan menggunakan penanganan kesalahan rutinitas, atau kecelakaan0
dan e0 = 1, memberikan hasil 1
Dengan kata lain, itu akan menjadi implementasi tergantung apa yang akan terjadi dan itu akan mungkin untuk menulis perangkat lunak yang menghasilkan yang benar dan hasil yang diprediksi untuk setiap nilai tapi tampaknya aneh-nilai untuk 0/0
yang meskipun demikian, masih konsisten secara internal.