Apple Falling Division

[Paul Curtis] di Segger memiliki serangkaian posting blog yang menarik tentang menghitung divisi. Ini dulunya menjadi topik yang lebih panas, tetapi saat ini banyak komputer atau bahasa komputer memiliki dukungan untuk multiplikasi dan pembagian bawaan. Tetapi beberapa prosesor tidak memiliki instruksi dan perpustakaan untuk melakukannya mungkin kurang ideal. Mengetahui cara memutar Anda sendiri mungkin memungkinkan Anda untuk mengoptimalkan kecepatan atau ruang. Angsuran saat ini mencakup menggunakan algoritma Newton untuk melakukan divisi.

Steve Martin memiliki sedikit tentang bagaimana menjadi jutawan dan tidak pernah membayar pajak. Dia mulai dengan mengatakan, “Pertama … dapatkan satu juta dolar. Lalu … “Metode ini agak seperti itu karena Anda pertama-tama harus tahu cara berkembang biak sebelum Anda dapat membelah. Premis dasar adalah twoFold: Metode Newton memungkinkan Anda memperbaiki estimasi timbal balik dengan multiplikasi berturut-turut dan kemudian mengalikan angka timbal balik sama dengan membagi. Dengan kata lain, jika kita perlu membagi 34 dengan 6, Anda dapat menulis ulang 34/6 hingga 34 * 1/6 dan jawabannya sama.

Perkiraan Newton untuk timbal balik memungkinkan Anda menebak jawabannya dan kemudian menyempurnakannya melalui serangkaian multiplikasi. Setiap perkalian menciptakan akurasi yang lebih baik. Anda dapat menggunakan ini untuk melakukan pertukaran kecepatan / ruang klasik. Misalnya, anggap saja kita ingin menemukan timbal balik byte (mungkin byte titik tetap). Tabel pencarian 256 elemen akan memberikan akurasi yang sempurna dan akan sangat cepat. Tidak ada lagi matematika yang diperlukan. Tapi bagaimana dengan 32 bit? Sekarang meja terlalu besar. Tetapi Anda bisa melihat ke atas, katakanlah, 8 bit pertama dari angka 32-bit. Atau lebih. Atau kurang. Tergantung pada apa yang penting bagi Anda.

Jadi sekarang Anda memiliki perkiraan yang buruk dari timbal balik Anda. Sir Issac dapat membuatnya lebih baik. Untuk beberapa angka A, Anda mengambil perkiraan Anda (x) dan melipatgandakannya bersama. Kurangi angka itu dari 2 dan Anda memiliki faktor untuk melipatgandakan estimasi lama Anda dengan mendapatkan perkiraan baru. Melewatkan di depan, jelas jika perkiraan Anda benar, multiplikasi akan memberi Anda 1 yang tidak akan mengubah estimasi lama sama sekali. Jika estimasi mati, Anda akan mendapatkan faktor penskalaan.

Sebagai formula, sepertinya ini:

x = x * (2-A * x);
Jadi, jika Anda memutuskan timbal balik 22 mungkin .02, pass pertama akan memberi Anda:

0,02 * (2-22 * 0,02) = .0312

0,0312 * (2-22 * .0312) = .0410

0,0410 * (2-22 * .0410) = 0,0450
Jawaban yang tepat adalah desimal berulang 0,0454545 dan jika Anda terus berjalan, Anda akan sampai di sana.

Tentu saja, maka Anda harus melipatgandakan sekali lagi untuk melakukan divisi.

Kami menyukainya bahwa pos memiliki implementasi titik tetap dan kemudian memeriksa kode perakitan yang dihasilkan untuk ARM, RISC-V, dan DSPIC30. Layak dibaca.

Kami menyukai trik matematika yang dapat kita gunakan dalam bahasa perakitan. Jika Anda sedang mengerjakan AVR dan Floating Point, jangan lewatkan metode ini.

Leave a Reply

Your email address will not be published. Required fields are marked *

Related Post