Seringkali kita menggunakan mikrokontroler untuk melakukan hal-hal dalam robot kita, tetapi perlu membuat beberapa perhitungan dalam desimal. Menggunakan variabel floating point sangat lambat, karena perpustakaan floating point perangkat lunak secara otomatis disertakan (kecuali Anda memiliki mikrokontroler high-end). Oleh karena itu, kami biasanya menggunakan aritmatika titik tetap.
Setiap kali saya melakukan ini, saya hanya menggunakan bilangan bulat, dan ingat di mana tempat desimalnya. Namun, perlu dipastikan bahwa semuanya konsisten, terutama ketika perhitungan melibatkan variabel di mana titik desimal berada di tempat yang berbeda.
Saya telah menerapkan fungsi atan2 titik tetap, tetapi karena saya mencoba memeras setiap tetes terakhir dengan presisi terbatas (16 bit), saya sering mengubah definisi di mana titik desimal berada, dan itu akan berubah ketika saya mengubahnya. Selain itu, saya akan memiliki beberapa konstanta, sebagai tabel kuasi, yang memiliki titik desimal tersirat di suatu tempat.
Saya ingin tahu apakah ada cara yang lebih baik. Apakah ada perpustakaan, atau kumpulan makro, yang dapat menyederhanakan penggunaan variabel titik tetap, membuat perkalian dan pembagian antara variabel campuran lebih mudah, dan memungkinkan deklarasi angka desimal atau ekspresi konstan, tetapi secara otomatis mengkonversi ke representasi titik tetap yang diinginkan pada saat kompilasi waktu?
sumber
Jawaban:
Akan lebih baik jika kita bisa memberi tahu kompiler kisaran dan ketepatan dari setiap variabel input titik tetap (mungkin tidak ada dua yang memiliki titik radix di lokasi yang sama), dan itu akan secara otomatis - pada waktu kompilasi - menggunakan rentang yang benar dan operasi presisi dan pengubahan ukuran untuk nilai menengah dan nilai akhir dalam serangkaian perhitungan. Saya pernah mendengar desas-desus bahwa mungkin saja melakukannya dalam bahasa pemrograman Ada atau dalam templat C ++.
Sayangnya, yang paling dekat yang saya lihat adalah perpustakaan aritmatika titik-tetap yang mengharuskan Anda, programmer, untuk secara manual memilih representasi yang benar dan secara manual memverifikasi bahwa setiap operasi mempertahankan jangkauan dan presisi yang memadai. Kadang-kadang mereka membuat perkalian dan pembagian antara variabel campuran lebih mudah. Seperti:
sumber
Saya telah menggunakan Perpustakaan TI IQMath untuk menerapkan titik-mengambang virtual pada titik tetap DSP mereka.
Itu menggunakan beberapa hal spesifik TI tetapi saya juga menggunakan kode itu sebagai basis untuk mengimplementasikan matematika floating-point virtual pada mikrokontroler lainnya. Dibutuhkan sedikit usaha untuk port tetapi jauh lebih mudah daripada memulai dari awal.
sumber
Ada sejumlah implementasi (tidak ada perpustakaan yang saya segera sadari) dari Binary Scaling (alias B-scaling)
Dalam hal ini, Anda menyimpan catatan mental (atau bahkan lebih baik, mendokumentasikan kode ...) di mana titik desimal berada, menggunakan shift untuk memindahkan titik desimal ke atas atau ke bawah.
Saya telah menggunakan B-scaling pada assembler pada proyek pertahanan, bahkan pada CPU terkecil sehingga dapat menjamin kesesuaiannya untuk hal lain ...
sumber
Jika Anda menggunakan bilangan bulat untuk mengingat di mana "titik" itu, mereka semacam menggunakan aritmatika titik mengambang. Titik tetap, benar-benar memiliki titik tetap .
atan
cos
Ini tergantung pada rentang nilai yang dibutuhkan aplikasi Anda, tetapi Anda mungkin ingin sepenuhnya pindah ke representasi titik tetap. Misalnya, alih-alih menyimpan nomor seperti ini:
di mana
number
bilangan bulat dandecimal_point
mengatakan di mana titik desimal berada, Anda dapat menyimpannya seperti ini:di mana bilangan bulat
integer.fraction
, yang memiliki penggunaan memori yang sama, rentang nilai yang lebih tinggi dan secara umum lebih mudah digunakan.sumber
#define
, kan? Saya pikir Anda benar-benar menyimpannya dan dapat bervariasi berdasarkan pada seberapa besar atau kecil jumlah Anda.