Saya memiliki sumber daya yang sangat terbatas karena saya bekerja dengan mikrokontroler. Apakah ada ekspansi seri taylor, tabel pencarian umum, atau pendekatan rekursif?
Saya lebih suka melakukan sesuatu tanpa menggunakan math.h's sqrt ()
algorithms
c
numerical-algorithms
tarabyte
sumber
sumber
Jawaban:
jika Anda ingin ekspansi seri daya murah dan kotor dioptimalkan (koefisien untuk seri Taylor bertemu perlahan) untuk
sqrt()
dan sekelompok trancendentals lainnya, saya memiliki beberapa kode dari dulu. saya dulu menjual kode ini, tetapi tidak ada yang membayar saya untuk itu selama hampir satu dekade. jadi saya pikir saya akan merilisnya untuk konsumsi publik. file khusus ini adalah untuk aplikasi di mana prosesor memiliki titik apung (presisi tunggal IEEE-754) dan mereka memiliki kompiler C dan sistem dev, tetapi mereka tidakmemiliki (atau mereka tidak ingin menautkan) stdlib yang akan memiliki fungsi matematika standar. mereka tidak membutuhkan ketelitian yang sempurna, tetapi mereka ingin segala sesuatunya menjadi cepat. Anda dapat dengan mudah merekayasa balik kode untuk melihat apa koefisien seri daya dan menulis kode Anda sendiri. kode ini mengasumsikan IEEE-754 dan menutup bit untuk mantissa dan eksponen.tampaknya "markup kode" yang dimiliki SE tidak ramah dengan karakter sudut (Anda tahu ">" atau "<"), jadi Anda mungkin harus menekan "edit" untuk melihat semuanya.
sumber
stdlib
.Jika Anda belum melihatnya, "Quake square root" hanyalah membingungkan. Ia menggunakan beberapa bit-level magic untuk memberi Anda perkiraan pertama yang sangat baik, dan kemudian menggunakan satu atau dua putaran pendekatan Newton untuk merevisinya. Mungkin membantu Anda jika Anda bekerja dengan sumber daya terbatas.
https://en.wikipedia.org/wiki/Fast_inverse_square_root
http://betterexplained.com/articles/understanding-quakes-fast-inverse-square-root/
sumber
Anda juga bisa memperkirakan fungsi akar kuadrat dengan menggunakan Metode Newton . Metode Newton adalah cara perkiraan di mana akar suatu fungsi berada. Ini juga merupakan metode iteratif di mana hasil dari iterasi sebelumnya digunakan dalam iterasi berikutnya hingga konvergensi. Persamaan untuk metode Newton untuk menebak di mana root adalah fungsi diberi tebakan awal x 0 didefinisikan sebagai:f( x ) x0
adalah tebakan pertama di mana root berada. Kami terus mendaur ulang persamaan dan menggunakan hasil dari iterasi sebelumnya hingga jawabannya tidak berubah. Secara umum, untuk menentukan menebak akar di ( n + 1 ) iterasi, mengingat menebak di n iterasi didefinisikan sebagai:x1 ( N + 1 ) n
Untuk menggunakan metode Newton untuk memperkirakan akar kuadrat, anggaplah kita diberi nomor . Karena itu, untuk menghitung akar kuadrat, kita perlu menghitung √Sebuah Karena itu, kami berusaha menemukan jawaban sedemikian rupa sehinggax= √Sebuah--√ . Kuadratkan kedua sisi, dan memindahkanake sisi lain dari persamaan menghasilkanx2-a=0. Dengan demikian, jawaban untuk persamaan ini adalah √x = a--√ Sebuah x2- a = 0 dan dengan demikian merupakanakardari fungsi tersebut. Karena itu, misalkanf(x)=x2-aadalah persamaan yang ingin kita temukan akar. Dengan mengganti ini ke dalam metode Newton,f′(x)=2x, dan oleh karena itu:Sebuah--√ f( x ) = x2- a f′( x ) = 2 x
xn+1=1
Namun, ada peringatan yang harus kita pertimbangkan ketika melihat persamaan di atas. Untuk akar kuadrat, solusinya harus positif dan agar iterasi (dan hasilnya) menjadi positif, kondisi berikut harus dipenuhi:
Karena itu:
Saat tag Anda mencari algoritme
C
, mari kita tuliskan dengan sangat cepat:Ini adalah implementasi yang cukup mendasar dari metode Newton. Perhatikan bahwa saya terus mengurangi setengah tebakan awal sampai kondisi yang kita bicarakan sebelumnya puas. Saya juga mencoba mencari akar kuadrat dari 5. Kita tahu bahwa ini kira-kira sama dengan 2,236 atau lebih. Menggunakan kode di atas memberikan hasil sebagai berikut:
Seperti yang Anda lihat, satu-satunya hal yang berbeda adalah berapa banyak iterasi yang diperlukan untuk menghitung akar kuadrat. Semakin tinggi jumlah yang ingin Anda hitung, semakin banyak iterasi yang akan diambil.
Saya tahu bahwa metode ini telah disarankan di posting sebelumnya, tetapi saya pikir saya akan mendapatkan metode ini dan juga menyediakan beberapa kode!
sumber
ya, rangkaian daya dapat dengan cepat dan efisien memperkirakan fungsi akar kuadrat, dan hanya melalui domain terbatas. semakin luas domain, semakin banyak istilah yang Anda butuhkan dalam seri daya Anda untuk menjaga kesalahan cukup rendah.
dimana
jika itu floating point, Anda perlu memisahkan eksponen dan mantissa seperti kode C saya lakukan di jawaban yang lain.
sumber
Sebenarnya ini dilakukan dengan menyelesaikan persamaan kuadrat menggunakan Metode Newton:
http://en.wikipedia.org/wiki/Methods_of_computing_square_roots
Untuk angka yang lebih besar dari satu, Anda dapat menggunakan ekspansi Taylor berikut:
http://planetmath.org/taylorexpansionofsqrt1x
sumber
Dalam presisi 4%, jika saya ingat dengan baik. Itu digunakan oleh insinyur, sebelum penguasa dan kalkulator logaritmik. Saya mempelajarinya dalam Notes et formules de l'ingénieur, De Laharpe , 1923
sumber