Manakah yang dihitung lebih cepat, atau atau ? , dan adalah real positif dengan .log a c b √ abcb>1
Jenis algoritma apa yang akan Anda gunakan dalam perbandingan? Apa kompleksitasnya?
Misalnya, ketika atau c ≈ a b
Pertanyaan ini terinspirasi oleh komentar pada pertanyaan pertukaran tumpukan Matematika. Apa tujuan perkiraan Stirling terhadap faktorial? . Terutama, komentar-komentar itu ditinggalkan oleh mjqxxxx , Thomas Andrews dan saya.
Jawaban:
Lihat jawaban saya untuk pertanyaan ini untuk beberapa masalah terkait.
Secara umum, komputer hanya dapat menambah, mengurangi, mengalikan, membagi, dan menggeser bit. Demi argumen, mari kita asumsikan bahwa Anda tidak menghitung dalam kasus khusus di mana adalah kekuatan 2 dan adalah bilangan alami, karena kasus tersebut berkurang menjadi sedikit pergeseran, dan karenanya mudah. a bSebuahb Sebuah b
Jika adalah bilangan alami, dan Anda ingin menghitung , Anda dapat menggunakan eksponensial rantai penjumlahan . Setiap kasus lain dalam pertanyaan Anda sulit (secara umum).a bb Sebuahb
Beberapa algoritma cepat yang digunakan untuk memperkirakan fungsi-fungsi ini ke akurasi tinggi memerlukan sihir hitam. Untuk melihat apa yang saya maksud dengan "ilmu hitam," lihat posting blog ini oleh Martin Ankerl dan makalah terkait yang dia tautkan dalam Neural Computation . Lihat juga algoritma CORDIC .
Jenis trik bit-flipping yang serupa dijelaskan dalam Hacker's Delight (tautannya adalah ke situs web pendamping buku tersebut).
Cara lain untuk menghitung perkiraan yang baik menggunakan analisis numerik (lihat artikel Wikipedia tentang Teori Aproksimasi ). Salah satu cara buruk untuk melakukannya adalah dengan memasang persamaan diferensial yang sesuai dan mengintegrasikannya menggunakan metode numerik seperti metode Euler (seperti yang saya katakan, perkiraan yang buruk, tetapi Anda dapat melakukannya). Cara yang lebih baik untuk melakukannya adalah dengan menggunakan aproksimasi seri. Serial Taylor konvergen terlalu lambat, sehingga sesuatu seperti aproksimasi Padé atau jenis aproksimasi seri konvergen cepat dapat digunakan sebagai gantinya (aproksimasi rasional lainnya, seri Chebyshev, dll.).
Algoritme yang Anda gunakan untuk memperkirakan fungsi di atas akan tergantung pada arsitektur Anda, persyaratan kecepatan, dan persyaratan akurasi.
Masalah dengan berbicara tentang kompleksitas adalah bahwa algoritma apa pun hanya akan menghitung perkiraan floating point dari fungsi yang Anda sebutkan, sehingga waktu berjalan tentu akan tergantung pada keakuratan yang Anda inginkan dari perkiraan Anda. Bahkan dengan mempertimbangkan itu, saya tidak berpikir bahwa kompleksitas komputasi adalah perkiraan kinerja yang baik pertama; ukuran input Anda akan diukur dalam bit (yaitu, jumlah bit yang dibutuhkan untuk mewakili , , danb cSebuah b c ), yang akan bergantung pada presisi, daripada tergantung pada besarnya input numerik itu sendiri. Untuk tujuan praktis, ketepatan representasi numerik angka tidak akan bervariasi banyak (presisi tunggal, presisi ganda, presisi quad), dan Anda biasanya tidak memutuskan untuk menggunakan presisi itu berdasarkan estimasi kompleksitas komputasi dari fungsi skalar apa pun. . Metrik yang paling relevan adalah jam dinding, dan kecuali Anda menggunakan arsitektur khusus (embedded system) atau aplikasi Anda benar-benar menuntut eksponensial cepat (lihat tautan posting blog dan tautan Perhitungan Saraf di atas), pustaka intrinsik di bahasa pilihan mungkin baik-baik saja.
sumber
Ini adalah pertanyaan yang bagus karena memahami algoritma dan kinerja numerik merupakan prasyarat penting untuk menjadi ilmuwan komputasi yang efektif. Pada saat yang sama, ini adalah pertanyaan yang buruk karena kendala yang diajukan tidak cukup memenuhi syarat untuk memberikan jawaban yang bermakna.
Kinerja ketiga perhitungan akan sangat bergantung pada keakuratan yang dibutuhkan dalam hasil akhir serta ketepatan minimum yang diperlukan untuk merepresentasikan operan. Anda memenuhi syarat , , dan sebagai bilangan real positif, tapi kami juga perlu tahu berapa banyak angka biner diperlukan untuk mewakili mereka secara akurat. Untuk memahami pertimbangan kinerja untuk bilangan real umum, pertama-tama kita harus memahami bagaimana komputer mewakili bilangan bulat serta bagaimana perkiraan bilangan real menggunakan angka floating-point.b c d nSebuah b c dn
Ketika komputer beroperasi pada integer , maka jumlah digit biner yang dibutuhkan jelas sama dengan log dari besarnya integer, ditambah bit tambahan untuk menangani tanda:2M. 2
2 | M | + 1dn= log2| M.| +1
Misalnya, angka -8 dapat direpresentasikan dengan 4 digit biner. Untuk kinerja dan efisiensi ruang, arithmetic logic units (ALUs), yang bertanggung jawab untuk perhitungan numerik bilangan bulat pada unit pemrosesan modern, dirancang untuk menangani matematika pada bilangan bulat hingga beberapa ukuran tetap, yang paling umum saat ini adalah d = 32 dan d = 64. Bukan hanya prosesor x86 seperti di komputer Anda yang memiliki ALU, mereka adalah blok bangunan dasar arsitektur komputer di mana-mana dalam masyarakat elektronik saat ini. Jika Anda terbiasa dengan konsol video game, Anda mungkin ingat Nintendo 64, sistem video game yang diberi nama sesuai ukuran (dalam bit), unit logika aritmatika pada prosesor konsol dirancang untuk menangani.
Penambahan, pengurangan, dan perkalian bilangan bulat pada unit logika aritmatika sangat efisien, dan biasanya tidak memerlukan lebih dari beberapa siklus untuk dihitung. Divisi kurang berkinerja, dan pada prosesor modern dapat memerlukan sebanyak beberapa lusin siklus. Kinerja tergantung pada arsitektur unit pemrosesan (dan implementasi yang sesuai dari unit logika aritmatika) dan frekuensinya. Perhatikan bahwa prosesor 64-bit biasanya dapat melakukan aritmatika pada operan bit pada kecepatan yang sama untuk mana saja antara 1 dan 64.xx x
Dalam komputasi umum, dan terutama dalam komputasi ilmiah, matematika bilangan bulat sangat sulit untuk banyak komputasi, dan diperlukan representasi angka lainnya, yang disebut representasi 'floating-point'. Angka floating-point mewakili kompromi antara cara kerja mikroprosesor modern (pengangkutan data sekitar dalam bit bakhil) dan kebutuhan perhitungan dengan mewakili angka pada prosesor dalam notasi ilmiah terpotong, menggunakan basis tetap (biasanya atau ) dan mewakili jumlah menggunakan dua bilangan bulat, sebuah mantissa (significand di beberapa kalangan) , dan eksponen . Angka diberikan kemudian kira-kira direpresentasikan sebagai:b b = 2 b = 10 s e xn b b = 2 b = 10 s e x
Saya katakan kira-kira karena harus jelas bahwa bahkan rasional sederhana seperti tidak dapat direpresentasikan secara tepat sebagai angka titik-mengambang untuk basis standar. Jumlah digit yang dikomit untuk signifikan dan menentukan akurasi angka, yang relatif terhadap besarnya sendiri. Standar IEEE 754 menetapkan sejumlah aturan untuk bagaimana angka floating-point diharapkan untuk berperilaku, termasuk rentang signifikan dan mantissa (dan rentang serta presisi yang sesuai) untuk beberapa nilai penting , sehingga perhitungan numerik dapat diulang dalam beberapa toleransi. Ada sedikit kehalusan tentang bagaimana angka floating-point bekerja yang saya tidak bisa berharap untuk menangkap dalam jawaban ini, untuk pengantar yang bagus saya sarankan dn13 dn "Apa Yang Harus Diketahui Setiap Ilmuwan Mengenai Aritmatika Titik Apung" .
Sejumlah besar upaya intelektual selama 50 tahun terakhir telah diinvestasikan dalam meningkatkan kemampuan prosesor untuk menghitung operasi floating-point aritmatika secara efisien. Pada prosesor modern, perhitungan ini ditangani oleh satu atau lebih Floating-point units (FPUs), versi yang lebih canggih dari unit logika aritmatika yang dirancang untuk melakukan operasi aritmatika pada angka floating-point dan biasanya dirancang untuk menangani kedua IEEE 754 yang ditentukan 32 -bit-point floating-point (sering disebut sebagai 'floats') dan 64-bit floating-point number (sering disebut sebagai 'doubles') secara efisien. Mirip dengan unit logika aritmatika, unit floating-point sering dapat menghitung penjumlahan, pengurangan, dan penggandaan hanya dalam beberapa siklus, sedangkan pembagian biasanya membutuhkan sedikit lebih banyak.
1 Eksponen umum sering diterapkan dengan identitas berikut:
FYL2X + F2XM1 + ~ 20 = 80 + 51 + ~ 20 = ~ 151 siklus
2 Ini dapat ditransformasikan menjadi dua logaritma dan pembagian dengan mengubah identitas basis dan tidak perlu pensaling ulang untuk hasil yang akurat.
2 * FYL2X + FDIV = 2 * 80 + (7 hingga 27) = 167 hingga 187 siklus
[3] Ini setara dengan divisi yang diikuti oleh eksponensial, jadi [1] ditambah FDIV, ~ 175 siklus.
sumber
Biarkan saya melihat apakah saya dapat memparafrasekan pertanyaan:
Jawaban : itu benar-benar tergantung pada apakah c memiliki ketergantungan pada a, dan bagaimana a membandingkan dengan b (lebih besar dari, kurang dari, atau sama).
sumber