Saya telah menjelajahi REFERENSI LANGUAGE di situs web Arduino , dan saya tidak dapat menemukan padanan non-Float dengan pow()
saya harus kehilangan sesuatu yang besar, tetapi untuk kehidupan saya, saya bingung! Saya menemukan pow()
di kolom FUNGSI di bawah judul Matematika (seperti yang saya harapkan), tetapi dikatakan bahwa kedua parameter, [basis] dan [eksponen] keduanya (float). Dan hanya ada enam entri lainnya di bawah judul Matematika; tidak satupun dari mereka tampaknya menjadi versi integer. Yang ingin saya lakukan adalah menghasilkan kekuatan 2 menggunakan eksponen dari 0 hingga 10. Seperti 2 ^ 0 = 1 lalu 2 ^ 1 = 2 lalu 2 ^ 2 = 4 lalu 2 ^ 3 = 8 lalu 2 ^ 4 = 16 lalu 2 ^ 5 = 32 lalu 2 ^ 6 = 64 lalu 2 ^ 7 = 128 lalu 2 ^ 8 = 256 lalu 2 ^ 9 = 512 lalu 2 ^ 10 adalah 1024
Apakah menggunakan pelampung adalah satu-satunya cara saya bisa melakukan ini? Saya mulai merasa seperti berselisih dengan kenyataan, dan telah benar-benar menghitung obat saya, tetapi saya berada di tempat yang seharusnya. Izinkan saya meminta maaf sebelumnya atas pengawasan mengerikan yang telah saya buang-buang waktu, tetapi saya telah melewati semua 9 halaman tag dan telah melakukan pencarian yang pernah saya pikirkan. Saya akui bahwa saya tidak menghabiskan banyak waktu, tapi saya yakin ini hanya akan seperti lima menit!
sumber
Jawaban:
Untuk kasus umum, jawaban @dat_ha benar, tetapi perlu dicatat bahwa Anda menginginkan kasus yang sangat spesial ... kekuatan dua. Karena komputer menggunakan aritmatika biner, operasi yang melibatkan kekuatan dua sering memiliki beberapa pintasan yang tersedia.
Mengalikan angka dengan kekuatan dua dapat dilakukan dengan operasi shift kiri (
<<
), yang secara harfiah menggeser digit representasi biner dari angka (yaitu, bit) ke kiri. Dalam basis dua, menggeser bit satu tempat ke kiri sama dengan mengalikan 2, sama seperti pada basis 10 menggeser digit satu tempat ke kiri sama dengan mengalikan dengan 10. Untuk penjelasan lengkap tentang operator shift kiri di C ++ , lihat jawaban ini di Stack Overflow .Penting untuk dicatat bahwa pergeseran kiri dapat kehilangan informasi; bit bergeser dari ujungnya hilang. Karena Anda membutuhkan kekuatan 2 hingga 10, Anda aman saat bekerja dengan bilangan bulat yang ditandatangani, yang memiliki nilai maksimum
2^15-1
pada Arduino Uno .Mengingat peringatan itu, berikut adalah fungsi untuk menghitung kekuatan dua dalam batasan ini. Ini adalah kode yang sangat cepat karena operasi shift kiri adalah operasi level yang sangat rendah, dan tidak ada multiplikasi yang benar-benar dilakukan.
sumber
unsigned long
.Ia bekerja dengan
int
,double
,long
danfloat
.unsigned long
danunsigned int
juga harus bekerja. Anda tidak diharuskan menggunakan mengapung HANYA.Semoga ini bisa membantu!
sumber
double
. Sebenarnya, karena floating point IEEE didasarkan pada representasi biner / eksponen biner, setiap kekuatan 2 harus persis dapat diwakili bahkan di luar 2 ^ 53 (titik di manadouble
tidak dapat mewakili setiap bilangan bulat sembarang, 1 unit di tempat terakhir dari mantissa lebih besar dari 1,0).pow()
integer, tetapi Arduino AFAICT bahkan tidak memiliki floating point perangkat keras, jadi ini adalah jawaban yang mengerikan.pow()
Implementasi integer seperti ini yang berjalan dalam log2 (n) penggandaan waktu dan penambahan untuk mengakumulasikan hasil hampir pasti akan berkinerja lebih baik, dan gagal menyebutkan bahwa bit shift bekerja untuk power 2 hanya menjadikan ini jawaban yang mengerikan untuk pertanyaan ini.