Hanya satu jenis angka dalam desain bahasa

8

Saat ini saya sedang belajar tentang konstruksi kompiler dan desain bahasa dan saya berpikir tentang tipe data asli apa yang ingin saya dukung dalam bahasa saya. Sekarang ada banyak bahasa yang membuat perbedaan antara bilangan bulat dan bilangan real. Namun, saya ingat menonton ceramah oleh Douglas Crockford di mana dia berkata:

Memiliki jenis nomor tunggal dalam sistem berarti Anda tidak dapat membuat bug dengan memilih jenis nomor yang salah

Dia juga menyebutkan bahwa dia merekomendasikan representasi angka yang berbeda dengan IEEE-754 yang biasa digunakan (tolong perbaiki saya jika saya salah), yaitu DEC64. Karena itu pertanyaan saya: Untuk bahasa tujuan umum yang memiliki fokus pendidikan utama, representasi nomor apa yang harus saya gunakan?

EDIT: Dengan fokus pendidikan saya berbicara tentang kemajuan saya sendiri dalam belajar tentang kompiler, bukan untuk mendidik orang lain.

Rompi Niklas
sumber
4
Tidak ada jawaban yang tepat di sini. Untuk tujuan pendidikan, saya akan merekomendasikan menggunakan desimal presisi acak (mis. Javas BigDecimal dan BigInteger). Memiliki semua fleksibilitas yang dapat diminta, jangan harus menjelaskan kesalahan pembulatan tepat di awal dan berperilaku sangat seperti kalkulator yang biasa digunakan siswa.
marstato
5
Pertanyaan mulai bertanya tentang jenis nomor kemudian beralih ke representasi nomor . Yang agak membingungkan, mungkin juga bingung. Lebih jauh lagi, bahkan jawaban berdasarkan pendapat mungkin akan melenceng jika Anda tidak dapat mengklarifikasi fokus pendidikan yang Anda sebutkan: apakah itu menjadi bahasa bagi orang yang belajar untuk memprogram (seperti Pascal), sebuah proyek untuk diri Anda sendiri pendidikan, bahasa yang akan digunakan oleh tots belajar berhitung, ...?
Tanda Kinerja Tinggi
1
Terima kasih, saya mengedit pertanyaannya. Saya menyebutkan kedua JENIS nomor dan PERWAKILAN karena saya firgured mungkin seseorang bisa mengarahkan saya ke arah yang benar untuk kedua masalah saya :)
Niklas Vest
Ingat saja, mampu menghilangkan satu kelas bug tidak selalu berarti jumlah bug Anda turun.
whatsisname
1
"Yang memiliki fokus pendidikan utama" Seperti pendidikan ilmu komputer? Karena satu masalah yang akan Anda hadapi dari sudut pandang desain bahasa adalah mendukung operator biner seperti aritmatika dan perubahan logis. (Ini berperan dalam aturan tata bahasa diutamakan operator juga jika Anda menyertakan operator biner untuk mempelajari bagaimana bahasa menangani hal-hal). Jika Anda tidak peduli dengan itu maka Anda bisa menggunakan tipe data tunggal. (JS memiliki satu jenis "Nomor" jika Anda ingin melihat cara aneh untuk menangani sesuatu).
Sirisian

Jawaban:

11

Kami memiliki representasi angka yang berbeda secara umum karena mereka memiliki kekuatan dan kelemahan yang berbeda, baik itu kecepatan, presisi, atau jangkauan. Juga ini harus menjadi kasus karena kita tidak dapat mewakili semua bilangan real dengan memori yang terbatas, kita selalu harus memilih beberapa yang tidak dapat kita wakili dengan tepat.

Kutipan Doug Crockford yang Anda miliki adalah idiot batas, jika Anda hanya dapat memilih satu representasi, OK, Anda tidak dapat memilih yang salah, tetapi Anda juga tidak dapat memilih yang benar. yaitu satu-satunya pilihan Anda akan bekerja untuk beberapa penggunaan tetapi tidak untuk semua.

Memang benar bahwa beberapa representasi mungkin lebih baik karena pilihan goto pertama DEC64 terlihat masuk akal di sini. Ini adalah representasi floating point desimal, sehingga akan kurang mengejutkan daripada IEEE-754 (yang merupakan floating point biner) dalam kebanyakan situasi karena orang cenderung berpikir dalam desimal misalnya dapat mewakili 0,3 persis. Itu masih akan memiliki masalah representasi dalam beberapa keadaan misalnya menambahkan jumlah yang sangat besar dan sangat kecil bersama-sama

untuk bacaan lebih lanjut saya akan menyarankan Richard Harris 'serangkaian artikel' mengapa X tidak akan memperbaiki Anda memamerkan titik blues '

jk.
sumber
tautan ke artikel Harris dapat ditemukan dalam jawaban ini untuk pertanyaan terkait softwareengineering.stackexchange.com/a/101197/10563
jk.
2

Untuk bahasa umum, angka harus berperilaku seperti yang diajarkan di kelas matematika. Hanya bahasa tujuan khusus, seperti yang untuk driver perangkat, yang harus memiliki matematika khusus.

Saya akan merekomendasikan menggunakan angka presisi sembarang daripada yang presisi tetap. Ya, mereka lebih lambat tetapi mereka berperilaku seperti orang-orang mengharapkan angka untuk berperilaku. Menempatkan batas buatan pada mereka akan dilaporkan sebagai bug.

shawnhcorey
sumber
5
Sayangnya, angka-angka seperti yang ada di kelas matematika tidak dapat direpresentasikan dalam memori terbatas, yang merupakan alasan mengapa kami memiliki begitu banyak representasi angka yang berbeda.
Jörg W Mittag
4
Dan melaporkan "kehabisan memori" ketika seseorang mencoba menghitung SQRT (2.0) mungkin juga akan dianggap sebagai bug.
Simon B
3
Jadi, tipe nomor tunggal Anda pada kenyataannya merupakan tipe tipe tak terhingga tergantung pada beberapa parameter.
Deduplicator
2
@shawnhcorey: Jadi, Anda ingin meminta secara manual menentukan presisi untuk setiap operasi?
Deduplicator
2
@shawnhcorey Keadaan global adalah kejahatan. Dan sekarang itu mengganggu semua aritmatika? Juga, bagaimana dua variabel dengan parameter yang berbeda berinteraksi?
Deduplicator