Mewakili bilangan real tanpa kehilangan presisi


10

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?


12
Anda hanya akan dapat mewakili bilangan rasional dengan cara ini.
Andrej Bauer

Bagaimana Anda mengusulkan untuk menerapkan operasi aritmatika pada angka dalam representasi ini? Menggunakan logaritma untuk mengubah basis? Ini akan jauh lebih mahal daripada IEEE floating-point matematika.
David Zhang

Yah, saya tidak tahu. Saya bukan seorang insinyur :) Jelas, saya tidak dapat mengimplementasikannya dalam perangkat keras. Implementasi yang lambat dan tidak efisien dapat dilakukan dalam C. Ini hanya akan menjadi eksperimen
termasuk

Jawaban:


20

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.aba,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.


Bolehkah saya mengajukan pertanyaan lain? Jika Anda seorang insinyur Intel di tahun 80-an, bagaimana Anda akan "mendesain" format bilangan real Anda?
Termasuk

3
Saya tidak memenuhi syarat untuk menjawab itu, karena saya bukan seorang insinyur, saya seorang peneliti teori. Saya tidak melihat banyak kesalahan dengan IEEE float dan standar ganda, dan sekarang quad. Saya tidak berpikir ada banyak aplikasi tergantung pada aritmatika presisi yang lebih tinggi, dan mereka yang dapat menggunakan versi yang didukung perangkat lunak.
jmite

Aljabar simbolis bukanlah formalisme yang benar untuk aritmatika nyata yang tepat. Anda memerlukan representasi yang memungkinkan mantisa besar secara sewenang-wenang.
Andrej Bauer

8
@AndrejBauer: Mantissa besar yang sewenang-wenang tidak akan menyelamatkan Anda jika Anda ingin representasi yang tepat dari . 2
user2357112 mendukung Monica

@ jamite Anda terlalu sederhana :)
incud

22

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.


Seseorang dapat membatasi persyaratan dari mewakili setiap bilangan real untuk hanya membatasi bilangan real itu, yang bisa menjadi output dari mesin turing. Itu hanya akan menjadi jumlah bilangan real yang dapat dihitung, tetapi masih akan mencakup setiap angka yang ingin Anda wakili. Tapi saya tidak berpikir Anda bisa melakukan perhitungan yang efisien dengan angka seperti itu.
kasperd

3
@kasperd Mereka disebut real yang dapat dihitung . Sayangnya, hal-hal seperti kesetaraan tidak dapat dihitung atas real yang dapat dihitung.
David Richerby

Memang cukup jelas bahwa menghitung kesetaraan pada angka-angka seperti itu sama dengan memecahkan masalah yang terputus-putus. Diberikan TM, seseorang dapat mendefinisikan bilangan real, yang dimulai dengan banyak desimal yang nol, persis sebanyak waktu berjalannya TM, dan kemudian diikuti oleh satu. Membandingkan angka itu dengan nol sama dengan memecahkan masalah terputusnya TM asli.
kasperd

Jawaban ini salah. Alan Turing dalam makalah pertamanya tentang mesin, yang di dalamnya ia menemukan mesin Turing, berbicara tentang mewakili real sebagai rangkaian data tanpa batas . Ini mengarah pada ide yang disebut "Mesin Tipe Turing II", dan ada teori perhitungan bilangan real yang sangat sukses berdasarkan ide tersebut. Ini juga diterapkan dalam praktik, lihat jawaban saya.
Andrej Bauer

1
Mungkin memang secara teknis, tapi itu melenceng, yaitu bahwa ada representasi tak terbatas yang masuk akal dari bilangan real. Dan itu tidak aneh: koneksi TCP / IP, atau panggilan Skype, atau umpan video dari kamera adalah semua contoh (berpotensi) jumlah data tak terbatas. Tidak ada batasan apriori pada seberapa banyak informasi yang dapat mereka berikan. Hanya ada batasan pada seberapa banyak informasi yang dapat Anda peroleh darinya dalam jumlah waktu yang terbatas.
Andrej Bauer

7

bmebme2

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.


1 tetapi saya akan keberatan bahwa Anda tidak dapat mewakili string tanpa batas dengan pendekatan terbatas tanpa kehilangan presisi , seperti yang dipersyaratkan oleh pertanyaan. Tentu, Anda bisa mendapatkan ketepatan sebanyak yang Anda inginkan - sebanyak mungkin dengan memperkirakan dengan rasional - tetapi itu tidak cukup seperti yang ditanyakan oleh pertanyaan itu. Bisa dibilang, itu masalah dengan pertanyaan, bukan jawabannya.
David Richerby

2
Intinya adalah bahwa kita tidak mewakili dengan string yang terbatas. Kami mewakili dengan string tanpa batas , tetapi kami hanya membutuhkan bagian terbatas dari string tanpa batas pada setiap tahap perhitungan. Atau dengan kata lain: tidak ada kehilangan precision, karena struktur data menyimpan seluruh informasi, tetapi tentu saja Anda tidak dapat mengakses atau memproses semua informasi sekaligus: struktur data memberi Anda sebanyak mungkin presisi yang Anda minta . Hambatannya bukan pada sisi struktur data, tetapi lebih pada sisi "konsumen" yang ingin mendapatkan informasi darinya.
Andrej Bauer

22=2k2 k222k1.99...

2
@ Thomas: perhitungan simbolik tidak mewakili bilangan real, tetapi biasanya beberapa subfield dari real, biasanya yang dihasilkan oleh fungsi dasar dan akar polinomial. Subbidang ini tidak lengkap (ditutup di bawah batas urutan Cauchy) atau selesai secara komputabel (ditutup di bawah batas yang dapat dihitung dari urutan Cauchy). Representasi bukanlah representasi real kecuali Anda dapat mewakili semua real (dapat dihitung) real: dan perhitungan simbol gagal kondisi ini.
Andrej Bauer

1
Pernyataan tentang penghitungan ini tidak relevan karena real yang dihitung tidak dapat dihitung secara computable.
Andrej Bauer

7

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 :

Teorema 5-1. - Ekspresi fraksi lanjutan dari bilangan real adalah terbatas jika dan hanya jika bilangan real itu rasional.

Kutipan dari Mathworld - Fraksi Lanjutan Berkala

... fraksi lanjutan adalah iff periodik jika itu adalah akar polinomial kuadrat.

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.


ππ

Representasi fraksi lanjutan dari real diusulkan sebagai implementasi untuk aritmatika nyata yang tepat beberapa waktu lalu oleh J. Vuillemin. Ternyata tidak terlalu efisien karena jumlahnya menjadi cukup besar segera, dan sulit untuk mengurangi ukurannya.
Andrej Bauer

Fraksi lanjutan memiliki beberapa masalah komputasi bahkan untuk mewakili bilangan rasional - sementara mereka dapat dibandingkan secara relatif cepat menggunakan varian urutan leksikografis, dan sementara memanipulasi fraksi lanjutan tunggal itu mudah, baik penambahan (biner) dan multiplikasi pada CF adalah operasi yang cukup rumit untuk melaksanakan.
Steven Stadnicki

5

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:

x.x>0x22=0x33=0

ex

sin{xπ|sinx=0}sin

exeix


Alfred Tarski (1948), Metode Pengambilan Aljabar dan Geometri Tingkat Dasar .


2

Dimungkinkan untuk mewakili kelas angka yang sangat besar yang disebut angka aljabar , dengan memperlakukannya sebagai akar polinomial.

πe


eeixsincos{xR|sinx=0}

@ Nama samaran Ini sepertinya sangat menarik, tapi saya rasa saya tidak memiliki latar belakang matematika untuk memahaminya dengan benar ... Apa yang Anda maksud dengan "cukup dekat dengan bilangan bulat"?
More Axes

Saya akan mengubah jawaban saya untuk menjelaskan.
Nama samaran

1

π2


Jawaban ini salah. Ada seluruh area aritmatika nyata yang menjelaskan bagaimana merepresentasikan real oleh komputer. Asumsi bahwa real harus diwakili oleh string terbatas adalah salah. Kita juga bisa menggunakan string tanpa batas. Sudah Alan Turing menulis tentang ini di koran pertamanya , di mana ia menemukan mesin Turing!
Andrej Bauer

Dapatkah Anda menautkan ke makalah tentang cara menyimpan dan memanipulasi string infinate di komputer yang sebenarnya, karena itu akan menjadi jawaban atas pertanyaan yang diajukan. Juga itu bukan makalah pertamanya, publikasi pertama adalah 1936, makalah itu 1937.
lPlant

Anda benar itu kertas 1937. Untuk melihat bagaimana string tak terbatas dimanipulasi, Anda dapat melihat protokol TCP / IP, misalnya. Saya tidak pernah mengatakan bahwa semua yang asli harus disimpan di komputer.
Andrej Bauer

-1

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.


Sekali lagi ini adalah jawaban yang salah, dihasilkan dari ketidaktahuan. Ada seluruh area aritmatika nyata yang mempelajari cara merepresentasikan semua real dengan struktur data yang sesuai.
Andrej Bauer

@AndrejBauer Jadi Anda menyarankan ada struktur data yang dapat mewakili bilangan real? Setiap struktur data seperti itu harus menggunakan jumlah bit tak terbatas yang tak terhitung untuk mewakili jumlah apa pun.
Alice Ryhl

1
Sebuah dihitung jumlah bit mencukupi, pertama-tama, dan karena Anda tidak perlu semua dari mereka sekaligus, tidak pula Anda dapat memproses semuanya sekaligus, mereka dapat disimpan dalam waktu serta ruang.
Andrej Bauer

@AndrejBauer Jawaban ini benar, dan mengatakan hal yang sama seperti milik Anda, meskipun dengan informasi yang jauh lebih sedikit. Anda tidak dapat mewakili semua bilangan real di komputer. Anda dapat mewakili bilangan real apa pun , tetapi tidak sekaligus. Jika ada, saya akan membantah bahwa Anda dapat mewakili "banyak", karena Anda hanya dapat mewakili banyak secara halus di komputer mana pun, dan hanya hampir tidak ada (dalam pengertian matematika) dalam komputer abstrak yang setara dengan model perhitungan yang biasa (Turing setara mesin).
Gilles 'SANGAT berhenti menjadi jahat'

-1

Hal ini dimungkinkan untuk mewakili sejumlah tepatnya di mana input representable dengan menyimpan mereka sebagai string operasi jadi, misalnya, Anda menyimpan 1/3sebagai 1 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.


5+262=3

Memang. Bahkan, mungkin secara otomatis mustahil untuk mengotomatisasi sepenuhnya berhasil. Namun, hasilnya tetap akurat bahkan jika Anda belum menggunakan representasi sesederhana mungkin.
Jack Aidley
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.