Sekilas, tugas, yang lebih sederhana, semakin sedikit pengembang memikirkan tentang cara mengimplementasikannya dengan benar, dan kesalahan yang dibuat, paling-paling, ditemukan terlambat, paling buruk - tidak diperhatikan sama sekali. Ini akan menjadi tentang salah satu tugas ini, yaitu, pembagian fraksional dan penskalaan dalam pengontrol yang mendukung aritmatika bilangan bulat eksklusif.
Mengapa pemrogram aplikasi tidak memperhatikan seluk-beluk perhitungan di bawah kondisi aritmatika seperti itu, sebuah pertanyaan. Saya hanya berani menyarankan bahwa, dalam semua kemungkinan, kebiasaan membuat perhitungan pada kalkulator mempengaruhi ... Bagaimanapun, dengan keteraturan yang patut ditiru, "Saya memiliki kebahagiaan" untuk melihat bagaimana rekan-rekan di toko menginjak penggaruk yang sama. Bahan ini bertujuan menetralkan "rake" yang sama.
Dalam bilangan bulat aritmatika, hasil membagi satu bilangan bulat dengan yang lain terdiri dari dua angka - hasil bagi dan sisanya. Jika kita membuang sisa divisi, kita mendapatkan hasilnya, dalam nilai absolut, dibulatkan menjadi bilangan bulat yang lebih kecil.
Menyadari perhitungan dengan pecahan, momen ini sering diabaikan, dan, setelah terlewat, mereka menerima kerugian dalam keakuratan perhitungan. Selain itu, keakuratan perhitungan menurun dengan meningkatnya nilai pembagi. Sebagai contoh, bahwa 53/13, bahwa 64/13 akan menghasilkan 4, meskipun, pada kenyataannya, hasil bagi dari pembagian fraksi kedua jauh lebih dekat dengan 5.
Bahkan, membulatkan hasil ke keseluruhan terdekat mudah diatur. Untuk melakukan ini, cukup dengan menggandakan sisa divisi, menjumlahkannya sendiri, dan kemudian membaginya dengan nomor yang sama dengan yang awalnya dibagi, dan menambahkan hasil bagi dari divisi ini ke hasil bagi yang diperoleh dari operasi divisi awal.
Dalam contoh sederhana pertama, saya akan menunjukkan bagaimana pembulatan tersebut diterapkan dalam perangkat lunak menggunakan contoh menghitung rasio dua kuantitas
Mempertimbangkan fakta bahwa perhitungan seperti itu dalam program mungkin diperlukan berulang kali, kami menerapkan algoritma perhitungan dalam format yang sesuai untuk dimasukkan ke dalam subprogram.
Untuk pelaksanaan yang benar dari perhitungan antara yang diperlukan untuk ini, sebuah array dari lima register akan diperlukan, kami akan menyatakannya dengan istilah TEMP [0..4]. Mengapa lima dan tidak kurang, saya akan menjelaskan sedikit lebih rendah.
Algoritma tindakan:
1. TEMP[2]= A 2. TEMP[3]= B ----- 3. TEMP[0,1]= TEMP[2]/TEMP[3] 4. TEMP[1,2]= TEMP[1]*2 5. TEMP[4]= 0 6. TEMP[1..4]= TEMP[1,2]/TEMP[3,4] 7. TEMP[0]= TEMP[0]+TEMP[1] ----- 8. Y= TEMP[0]
Langkah 3 hingga 7 dapat dipindahkan ke subrutin.
Jika diinginkan, hasilnya dapat direkam langsung dengan menjumlahkan TEMP [0] dengan TEMP [1] di luar subrutin perhitungan. Ini tidak berprinsip. Satu-satunya hal yang perlu diingat adalah bahwa dengan banyak jenis perhitungan yang sama, penghapusan operasi penambahan ke badan utama program dapat menyebabkan peningkatan jumlah memori program yang digunakan olehnya.
Jadi mengapa dibutuhkan sebanyak 5 register untuk komputasi menengah? Dan operasi menjumlahkan sisa divisi dengan sendirinya, seperti yang disebutkan sebelumnya, digantikan dengan mengalikan sisanya dengan dua? Sangat sederhana - untuk beroperasi dengan satu set integer yang tidak terbatas.
Mari saya jelaskan: jika kita membagi, misalnya, angka 32767 dengan -32768 sisanya kita dapatkan 32767, dan hasil penambahannya tidak diragukan lagi akan melampaui kisaran bilangan bulat.
Yaitu, sisa dua kali lipat dari pembagian bilangan bulat dari fraksi untuk pembulatan hasil pembagian tersebut harus selalu disajikan dalam format bilangan bulat ganda.
Dilanjutkan ...