Bagaimana bc berbeda dari dc?

27

Apa perbedaan antara dcdan bckalkulator?

Kapan saya harus menggunakan dcdan kapan bc?

syntagma
sumber
Saya menggunakan exprsangat sering untuk perhitungan sederhana pada baris perintah dan dalam skrip.
MattBianco

Jawaban:

34

dcadalah alat yang sangat kuno dan agak lebih tua dari bc. Mengutip halaman Wikipedia :

Ini adalah salah satu utilitas Unix tertua, bahkan sebelum penemuan bahasa pemrograman C; seperti utilitas lain dari vintage itu, ia memiliki serangkaian fitur yang kuat tetapi sintaks yang sangat singkat.

Sintaksnya adalah notasi polish terbalik, yang pada dasarnya berarti bahwa argumen (yaitu angka) datang pertama diikuti oleh operator. Contoh dasar dcpenggunaannya adalah:

echo '3 4 * p' | dc

Di mana pdiperlukan untuk mencetak hasil perhitungan. bcdi sisi lain menggunakan notasi infiks yang lebih akrab dan dengan demikian lebih intuitif untuk digunakan. Berikut ini adalah contoh bcpenggunaan:

echo '3 * 4' | bc

Yang mana yang akan digunakan?

bcdistandarisasi oleh POSIX dan mungkin lebih portabel dari keduanya (setidaknya pada sistem modern). Jika Anda melakukan pekerjaan kalkulator manual maka itu pasti pilihan (kecuali Anda agak masokis). dcmasih dapat memiliki kegunaannya, di sini adalah kasus di mana notasi polish terbalik berguna. Bayangkan Anda memiliki program yang menampilkan aliran angka yang ingin Anda totalkan, misalnya:

23
7
90
74
29

Untuk melakukan ini dengan dcsangat sederhana (setidaknya dengan implementasi modern di mana setiap operator dapat mengambil lebih dari dua angka) karena Anda hanya perlu menambahkan a +pke aliran, misalnya:

{ gen_nums; echo +p } | dc

Tetapi dengan bcitu lebih kompleks karena kita tidak hanya perlu meletakkan di + antara setiap angka dan memastikan semuanya ada di baris yang sama, tetapi juga memastikan ada baris baru di akhir:

{ gen_nums | sed '$ !s/$/+/' | tr -d '\n'; echo; } | bc
Graeme
sumber
10
Anda telah membalik gen_numscontoh penggunaan yang sangat rumit bc. Ini bisa disederhanakan menjadi:gen_nums | paste -sd+ | bc
devnull
14
Fakta menyenangkan: Secara tradisional bchanya alat ujung depan yang menyusun bcnotasi dengan notasi dcdan menyalurkannya ke dalam dcuntuk mendapatkan hasilnya. Pada FreeBSD masih ada -cflag bcyang dengannya Anda masih dapat mengkompilasi ke dcnotasi . For example echo '3 * 4' | bc` sama dengan echo '3 * 4' | bc -c | dc. Lihat linux.die.net/man/1/bc dan freebsd.org/cgi/man.cgi?query=bc&sektion=1
Raphael Ahrens
14
Hmm, mana dcyang kamu gunakan? Pada Ubuntu 14.04 dan OS X, +operator selalu beroperasi tepat pada dua nilai dari stack
Digital Trauma
2
Contoh yang benar dari dcpenggunaan: gen_nums_nonnegative | dc -e '0 0 [+?z1<m]dsmxp'. Script ini untuk dcmembaca dan menambahkan angka satu per satu dalam satu lingkaran dan kemudian mencetak hasilnya. Lihat catatan tentang angka negatif.
ruvim
1
@RaphaelAhrens Menarik, di macOS bc -cmelakukan sesuatu yang aneh dan berbeda (dan -cbenderanya tidak berdokumen). Jika saya mencoba untuk mem-pipe-nya dc, saya mendapatkan banyak kesalahan (dan output tanpa piping ke dalam dcadalah sangat samar @iK3:K4:*W@r\n@i).
Konrad Rudolph
9

Perbedaan mendasar antara keduanya adalah yang dcmenggunakan notasi Polandia terbalik . Itu membutuhkan perintah eksplisit bahkan untuk menghasilkan output.

Anda dapat menambahkan dua bilangan bulat bcdengan mengatakan:

bc <<< "2+4"

dan itu akan menghasilkan 6pada garis dengan sendirinya. Namun, dcAnda harus mengatakan:

dc <<< "2 4 +p"

Anda juga dapat melakukan banyak hal menyenangkan menggunakan dc, misalnya merujuk pada jawaban saya di sini untuk memproduksi

Hello World!

menggunakan dc.

dc <<< "8 9 * P101P108P108P111P4 8 * P81 6 + P111P114P108P100P33P"

devnull
sumber
"Bc ditulis sebagai front-end untuk Dc"
Adam
3

dcadalah kalkulator sedangkan bcbahasa sebenarnya. Lihat halaman manual mereka.

dc

dc adalah kalkulator meja reverse-polish yang mendukung aritmatika presisi tak terbatas. Ini juga memungkinkan Anda untuk mendefinisikan dan memanggil makro. Biasanya dc membaca dari input standar; jika ada argumen perintah yang diberikan padanya, itu adalah nama file, dan dc membaca dan mengeksekusi isi file sebelum membaca dari input standar. Semua output normal adalah output standar; semua output kesalahan adalah kesalahan standar.

bc

bc adalah bahasa yang mendukung angka presisi acak dengan eksekusi pernyataan interaktif. Ada beberapa kesamaan dalam sintaksis dengan bahasa pemrograman C. Perpustakaan matematika standar tersedia dengan opsi baris perintah. Jika diminta, perpustakaan matematika didefinisikan sebelum memproses file apa pun. bc mulai dengan memproses kode dari semua file yang terdaftar di baris perintah dalam urutan yang tercantum. Setelah semua file diproses, bc membaca dari input standar. Semua kode dieksekusi saat dibaca. (Jika file berisi perintah untuk menghentikan prosesor, bc tidak akan pernah membaca dari input standar.)

Ini benar-benar tergantung pada apa yang Anda ingin lakukan secara matematis. Beberapa operasi tidak dimungkinkan menggunakan dc. Saya telah menggunakan keduanya selama bertahun-tahun sebagai tambahan pada beberapa alat kalkulator baris perintah lainnya. Lihat " Pemecah ekspresi baris perintah? " Untuk beberapa contoh tambahan.

slm
sumber
3
@REACHUS - Saya tidak yakin saya mengerti apa yang Anda minta? Karena dcmenjadi notasi polish kalkulator terbalik dan karena aku selalu menggunakan HP terbalik polish kalkulator notasi sebenarnya saya lebih suka menggunakan dcuntuk bctapi aku akan mengatakan mereka berdua kapan saja masih digunakan Anda perlu melakukan perhitungan matematika yang kompleks. Saya sering menggunakannya untuk mengonversi angka b / w basis 10 ke basis 16 dan basis 2. Tetapi saya telah menggunakannya untuk menghitung kolom dalam data tabular juga dari dalam skrip AWK.
slm
3
bcadalah bahasa dalam arti yang membuatnya dcramah manusia - bukan karena lebih kuat. Hari-hari ini aplikasi berbagi libs, tapi bcitu disebut bahasa dan dcsebuah kalkulator karena dcmelakukan matematika dan bcberbicara matematika - untuk dc. Ini manhalaman yang lebih lama : Bahasa yang disebut BC[1] telah dikembangkan yang menerima program yang ditulis dalam bahasa tingkat yang lebih tinggi dan mengkompilasi output yang ditafsirkan oleh DC. Beberapa perintah yang dijelaskan di bawah ini dirancang untuk antarmuka kompiler dan tidak mudah bagi pengguna manusia untuk memanipulasi.
mikeserv
2
Saya mengklaim dcjuga bahasa. mis. codegolf.stackexchange.com/a/47921/11259
Digital Trauma
1
@ DigitalTrauma Untuk berargumen bahwa itu bukan bahasa akan tidak masuk akal karena memiliki lexer dan parser. Tetapi untuk memperdebatkan bahwa itu dapat dibaca manusia, mengingat contoh itu, tidak masuk akal. Maksudku ... sial.
Parthian Shot
1
@ParthianShot Setuju. Bacaan saya tentang "dc adalah kalkulator sedangkan bc adalah bahasa yang sebenarnya" adalah bahwa slm menyiratkan bahwa dc bukan bahasa, yang saya tidak setujui. Tapi saya mungkin hanya membaca jawaban yang salah ...
Digital Trauma
0

Menurut pendapat saya yang sederhana dan sesedikit mungkin kata, GNU dc berbeda dari GNU bc dalam 3 cara:

1) Jika perpustakaan matematika bc keluar dari keprihatinan, untuk menyimpan sebanyak mungkin penekanan tombol (dalam kata-kata Jan ewukasiewicz: notasi bebas kurung) ketika melakukan aritmatika dasar, untuk lebih berkonsentrasi pada hal-hal penting dan untuk menghindari gangguan.

2) Dalam baris perintah Microsoft Windows 7, GNU dc mengkonsumsi lebih sedikit memori (~ 320K) daripada GNU bc (~ 360K).

3) Banyak kontrol granular dalam GNU dc daripada di GNU bc, misalnya, perintah stack dan register tidak ada pada GNU bc.

Versi 1.07.1 win32 untuk keduanya ada di https://embedeo.org/ws/command_line/bc_dc_calculator_windows/

bc_vs._dc
sumber