Titik mengambang saat ini (ANSI C float, dobel) memungkinkan untuk mewakili perkiraan bilangan real.
Apakah ada cara untuk merepresentasikan bilangan real tanpa kesalahan ?
Inilah ide yang saya miliki, yang sama sekali tidak sempurna.
Misalnya, 1/3 adalah 0,33333333 ... (basis 10) atau o.01010101 ... (basis 2), tetapi juga 0,1 (basis 3)
Apakah ide yang baik untuk menerapkan "struktur" ini:
base, mantissa, exponent
jadi 1/3 bisa menjadi 3 ^ -1
{[11] = base 3, [1.0] mantissa, [-1] exponent}
Ada ide lain?
Jawaban:
Itu semua tergantung apa yang ingin Anda lakukan.
Misalnya, apa yang Anda perlihatkan adalah cara yang bagus untuk mewakili bilangan rasional. Tapi itu masih tidak bisa mewakili sesuatu seperti atau e dengan sempurna.π e
Bahkan, banyak bahasa seperti Haskell dan Skema telah dibangun untuk mendukung bilangan rasional, menyimpannya dalam bentuk dimanaa,badalah bilangan bulat.Sebuahb a , b
Alasan utama bahwa ini tidak banyak digunakan adalah kinerja. Angka floating point sedikit tidak tepat, tetapi operasinya diimplementasikan dalam perangkat keras. Sistem yang Anda usulkan memungkinkan presisi yang lebih tinggi, tetapi membutuhkan beberapa langkah untuk diterapkan, sebagai lawan dari operasi tunggal yang dapat dilakukan dalam perangkat keras.
Diketahui bahwa beberapa bilangan real tidak dapat dihitung, seperti angka penghentian . Tidak ada algoritma yang menghitung digitnya, tidak seperti , di mana kita dapat menghitung digit ke- n selama kita menunggu cukup lama.π n
Jika Anda menginginkan ketepatan nyata untuk hal-hal bilangan irasional atau transendental, Anda mungkin perlu menggunakan semacam sistem aljabar simbolis, kemudian mendapatkan jawaban akhir dalam bentuk simbolis, yang bisa Anda perkirakan mendekati angka berapa pun. Namun, karena masalah ketidakpastian yang diuraikan di atas, pendekatan ini tentu terbatas. Itu masih bagus untuk hal-hal seperti aproksimasi integral atau seri tak terbatas.
sumber
Tidak ada cara untuk mewakili semua bilangan real tanpa kesalahan jika setiap bilangan ingin memiliki representasi terbatas. Ada banyak bilangan real tetapi tak terhitung banyaknya string terbatas 1 dan 0 yang dapat Anda gunakan untuk mewakili mereka.
sumber
Ada seluruh cabang matematika komputabel yang berurusan dengan aritmatika nyata yang tepat. Banyak struktur data untuk mewakili bilangan real yang tepat telah diusulkan: aliran digit, aliran kontraksi afin, sekuen rasional Cauchy, sekuen rasional Cauchy dari dyadic rationals, Dedekind cuts, sekuen interval shkrinking, dll. Ada implementasi aritmatika real berdasarkan pada ide-ide ini, misalnya:
Dari iRRAM ini adalah yang paling matang dan efisien. Marshall dalam proyek eksperimental, sedangkan yang ketiga adalah proyek siswa, tetapi juga yang paling mudah diakses. Ini memiliki pengantar yang sangat bagus menjelaskan masalah tentang perhitungan bilangan real, saya sangat menyarankan Anda melihatnya.
Biarkan saya berkomentar. Seseorang akan keberatan bahwa objek tak terbatas tidak dapat diwakili oleh komputer. Dalam beberapa hal ini benar, tetapi di lain itu tidak benar. Kami tidak pernah harus mewakili seluruh bilangan real, kami hanya membutuhkan perkiraan terbataspada setiap tahap perhitungan. Dengan demikian, kita hanya perlu representasi yang dapat mewakili hingga presisi yang diberikan. Tentu saja, begitu kita kehabisan memori komputer kita kehabisan memori komputer - tetapi itu adalah keterbatasan komputer, bukan representasi itu sendiri. Situasi ini tidak berbeda dari banyak lainnya dalam pemrograman. Misalnya, orang menggunakan bilangan bulat dalam Python dan mereka menganggapnya sebagai "besar sewenang-wenang" walaupun tentu saja mereka tidak dapat melebihi ukuran memori yang tersedia. Terkadang infinity adalah perkiraan yang berguna untuk jumlah terbatas yang sangat besar.
Selain itu, saya sering mendengar klaim bahwa komputer hanya dapat menangani bilangan real yang dapat dihitung . Ini melewatkan dua poin penting. Pertama, komputer memiliki akses ke data dari dunia eksternal, jadi kami juga harus membuat (tidak dapat diverifikasi) asumsi bahwa dunia eksternal juga dapat dihitung. Kedua, kita perlu membedakan antara apa yang real komputer dapat hitung, dan apa real itu dapat mewakili. Sebagai contoh, jika kita memilih aliran digit sebagai representasi real maka sangat mungkin untuk mewakili real yang tidak dapat dihitung: jika seseorang memberikannya kepada kita, kita akan tahu bagaimana cara mewakilinya. Tetapi jika kita memilih untuk mewakili real sebagai bagian dari kode sumber yang menghitung angka, maka kita tidak bisa mewakili real yang tidak dapat dihitung, jelas.
Bagaimanapun, topik ini paling baik ditangani dengan beberapa bacaan lebih lanjut.
sumber
Ada banyak implementasi Nomor Rasional yang efektif tetapi yang telah diusulkan berkali-kali dan bahkan dapat menangani beberapa irasional dengan cukup baik adalah Fraksi Lanjutan .
Kutipan dari Fraksi Lanjutan oleh Darren C. Collins :
Kutipan dari Mathworld - Fraksi Lanjutan Berkala
yaitu semua akar dapat dinyatakan sebagai fraksi lanjutan periodik.
Ada juga Fraksi Lanjutan yang Tepat untuk π yang mengejutkan saya sampai @AndrejBauer menunjukkan bahwa sebenarnya tidak.
sumber
Ada sejumlah saran "nyata nyata" di komentar (mis. Pecahan lanjutan, transformasi fraksional linier, dll). Tangkapan tipikal adalah bahwa sementara Anda dapat menghitung jawaban untuk rumus, kesetaraan sering kali tidak dapat ditentukan.
Namun, jika Anda hanya tertarik pada angka aljabar, maka Anda beruntung: Teori bidang tertutup nyata sudah lengkap, minimal, dan dapat dipilih. Ini dibuktikan oleh Tarski pada tahun 1948.
Tapi ada tangkapan. Anda tidak ingin menggunakan algoritma Tarski, karena algoritma ini ada di kelas kompleksitas NONELEMENTARY, yang sama tidak praktisnya dengan algoritma tidak praktis yang bisa didapat. Ada metode yang lebih baru yang mendapatkan kompleksitas ke DEXP, yang merupakan yang terbaik yang kita ketahui saat ini.
Perhatikan bahwa masalahnya adalah NP-hard karena termasuk SAT. Namun, tidak diketahui (atau diyakini) menggunakan NP.
EDIT Saya akan mencoba menjelaskan ini sedikit lagi.
Kerangka kerja untuk memahami semua ini adalah masalah keputusan yang dikenal sebagai Kepuasan Modulo Theories, atau disingkat SMT. Pada dasarnya, kami ingin menyelesaikan SAT untuk teori yang dibangun di atas logika klasik.
Jadi kita mulai dengan logika klasik orde pertama dengan tes kesetaraan. Simbol fungsi mana yang ingin kita sertakan dan apa aksioma mereka menentukan apakah teorinya dapat diterima atau tidak.
Ada banyak teori menarik yang diungkapkan dalam kerangka SMT. Misalnya, ada teori struktur data (misalnya daftar, pohon biner, dll) yang digunakan untuk membantu membuktikan program dengan benar, dan teori geometri Euclidean. Tetapi untuk tujuan kita, kita sedang melihat teori-teori dari berbagai jenis angka.
Aritmatika presburger adalah teori bilangan alami dengan tambahan. Teori ini dapat diputuskan.
Aritmatika kacang adalah teori bilangan alami dengan penjumlahan dan perkalian. Teori ini tidak dapat diputuskan, seperti yang dibuktikan oleh Gödel.
Tarski aritmatika adalah teori bilangan real dengan semua operasi lapangan (penjumlahan, pengurangan, perkalian, dan pembagian). Menariknya, teori ini dapat diputuskan. Ini adalah hasil yang sangat kontra-intuitif pada saat itu. Anda mungkin berasumsi bahwa karena itu adalah "superset" dari bilangan asli, maka "lebih sulit", tetapi ini tidak terjadi; bandingkan pemrograman linear di atas rasional dengan pemrograman linear di atas bilangan bulat, misalnya.
Mungkin tidak tampak jelas bahwa kepuasan adalah semua yang Anda butuhkan, tetapi itu saja. Misalnya, jika Anda ingin menguji apakah akar kuadrat positif 2 sama dengan akar pangkat tiga, Anda dapat menyatakan ini sebagai masalah kepuasan:
Alfred Tarski (1948), Metode Pengambilan Aljabar dan Geometri Tingkat Dasar .
sumber
Dimungkinkan untuk mewakili kelas angka yang sangat besar yang disebut angka aljabar , dengan memperlakukannya sebagai akar polinomial.
sumber
sumber
Anda tidak bisa mewakili semua bilangan real di komputer, tetapi Anda bisa mewakili banyak. Anda bisa menggunakan pecahan yang mewakili angka lebih banyak daripada pelampung. Anda juga bisa melakukan hal-hal yang lebih canggih seperti merepresentasikan angka sebagai root dari beberapa polinomial dengan perkiraan bahwa di bawah metode newton akan menyatu ke nomor tersebut.
sumber
Hal ini dimungkinkan untuk mewakili sejumlah tepatnya di mana input representable dengan menyimpan mereka sebagai string operasi jadi, misalnya, Anda menyimpan
1/3
sebagai1 divided by 3
, dengan menangani membatalkan operasi Anda dapat menyederhanakan operasi berikutnya untuk memberikan jawaban yang tepat untuk(1/3) * 3
. Ini juga dapat menangani situasi di mana Anda telah mengetahui hal yang irasional sepertiπ
dengan mempertahankannya dalam perhitungan Anda.Namun, ini membutuhkan peningkatan jumlah memori untuk setiap angka dan - dengan asumsi penyederhanaan Anda tidak sempurna - mungkin akan membutuhkan jumlah yang semakin meningkat untuk nilai yang sedang Anda kerjakan.
sumber