In che modo bc è diverso da dc?


27

Quali sono le differenze tra dce bccalcolatori?

Quando dovrei usare dce quando bc?


Uso exprmolto spesso per semplici calcoli sulla riga di comando e negli script.
MattBianco,

Risposte:


34

dcè uno strumento molto arcaico e un po 'più vecchio di bc. Per citare la pagina di Wikipedia :

È una delle più antiche utility Unix, precedente persino all'invenzione del linguaggio di programmazione C; come altre utilità di quell'annata, ha un potente set di funzionalità ma una sintassi estremamente concisa.

La sintassi è una notazione polacca inversa, che sostanzialmente significa che gli argomenti (cioè i numeri) vengono prima seguiti dall'operatore. Un esempio di base dcdell'uso è:

echo '3 4 * p' | dc

Dove pè richiesto per stampare il risultato del calcolo. bcd'altra parte usa la notazione infix più familiare ed è quindi più intuitivo da usare. Ecco un esempio di bcutilizzo:

echo '3 * 4' | bc

Quale usare?

bcè standardizzato da POSIX e quindi è probabilmente il più portatile dei due (almeno sui sistemi moderni). Se stai facendo un lavoro con la calcolatrice manuale, allora è sicuramente la scelta (a meno che tu non sia un po 'masochista). dcpuò comunque avere i suoi usi, ecco un caso in cui la notazione polacca inversa è utile. Immagina di avere un programma che emette un flusso di numeri che vuoi sommare, ad esempio:

23
7
90
74
29

Farlo dcè molto semplice (almeno con implementazioni moderne in cui ogni operatore può prendere più di due numeri) poiché devi solo aggiungere un +pflusso allo stream, ad esempio:

{ gen_nums; echo +p } | dc

Ma con bcesso è più complesso poiché non dobbiamo solo inserire un numero + tra ogni numero e assicurarci che tutto sia sulla stessa linea, ma anche assicurarsi che ci sia una nuova riga alla fine:

{ gen_nums | sed '$ !s/$/+/' | tr -d '\n'; echo; } | bc

10
Hai trasformato l' gen_numsesempio in modo orribilmente complesso usando bc. Potrebbe essere semplificato per:gen_nums | paste -sd+ | bc
devnull

14
Curiosità: tradizionalmente bcera solo uno strumento di front-end che compilava la bcnotazione alla notazione dce la convogliava dcper ottenere il risultato. Su FreeBSD c'è ancora la -cbandiera per la bcquale puoi ancora compilare l' eco della dcnotazione . For example '3 * 4' | bc` è uguale a echo '3 * 4' | bc -c | dc. Vedere la linux.die.net/man/1/bc e freebsd.org/cgi/man.cgi?query=bc&sektion=1
Raffaello Ahrens

14
Hmm, che dcstai usando? Su Ubuntu 14.04 e OS X, l' +operatore opera sempre su esattamente due valori dallo stack
Digital Trauma

2
La correttezza esempio di dcutilizzo: gen_nums_nonnegative | dc -e '0 0 [+?z1<m]dsmxp'. Questo script per dclegge e aggiunge i numeri uno per uno in loop e quindi stampa il risultato. Vedi la nota relativa ai numeri negativi.
Ruvim,

1
@RaphaelAhrens Interessante, su macOS bc -cfa qualcosa di strano e diverso (e la -cbandiera non è documentata). Se provo a collegarlo dc, ottengo un sacco di errori (e l'output senza piping in dcè molto criptico @iK3:K4:*W@r\n@i).
Konrad Rudolph,

9

Una differenza fondamentale tra i due è che dcusa la notazione polacca inversa . Richiede comandi espliciti anche per produrre un output.

Puoi aggiungere due numeri interi bcdicendo:

bc <<< "2+4"

e produrrebbe 6su una linea da solo. Tuttavia, dcdovresti dire:

dc <<< "2 4 +p"

Puoi anche fare molte cose divertenti usando dc, ad esempio, fai riferimento alla mia risposta qui per la produzione

Hello World!

usando dc.

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


"Bc è stato scritto come front-end per Dc"
Adam,

3

dcè una calcolatrice mentre bcè una lingua reale. Vedi le loro pagine man.

dc

dc è una calcolatrice da scrivania a inversione di lucidatura che supporta un'aritmetica di precisione illimitata. Inoltre, consente di definire e chiamare macro. Normalmente DC legge dallo standard input; se gli vengono dati argomenti di comando, sono nomi di file e dc legge ed esegue il contenuto dei file prima di leggere dallo standard input. Tutta l'output normale è di output standard; tutto l'output dell'errore è nell'errore standard.

avanti Cristo

bc è un linguaggio che supporta numeri di precisione arbitrari con esecuzione interattiva di istruzioni. Ci sono alcune somiglianze nella sintassi del linguaggio di programmazione C. Una libreria matematica standard è disponibile dall'opzione della riga di comando. Se richiesto, la libreria matematica viene definita prima di elaborare qualsiasi file. bc inizia elaborando il codice da tutti i file elencati nella riga di comando nell'ordine elencato. Dopo che tutti i file sono stati elaborati, bc legge dallo standard input. Tutto il codice viene eseguito così come viene letto. (Se un file contiene un comando per arrestare il processore, bc non leggerà mai dallo standard input.)

Dipende davvero da cosa alla fine vuoi fare matematicamente. Alcune operazioni non sono possibili utilizzando dc. Ho usato entrambi nel corso degli anni oltre a diversi altri strumenti di calcolatrice della riga di comando. Vedere " Risolutore di espressioni della riga di comando? " Per alcuni esempi aggiuntivi.


3
@REACHUS - Non sono sicuro di capire cosa stai chiedendo? A causa di dcessere una calcolatrice notazione polacca inversa e da allora ho sempre usato HP inversa calcolatrici Polish Notation Io in realtà preferisco usare dcper bcma direi che sono entrambi in qualsiasi momento ancora usato è necessario eseguire un calcolo matematico complesso. Li uso spesso per convertire i numeri in b / n dalla base 10 alla base 16 e alla base 2. Ma li ho usati per calcolare le colonne nei dati tabulari e all'interno di uno script AWK.
slm

3
bcera una lingua nel senso che rendeva l'essere dcumano, non che fosse più potente. In questi giorni le app condividono le librerie, ma sono bcstate chiamate una lingua e dcuna calcolatrice perché dcfacevano matematica e bcparlavano matematica dc. Ecco una manpagina più vecchia : è stato sviluppato un linguaggio chiamato BC[1] che accetta programmi scritti in linguaggi di livello superiore e compila un output interpretato da DC. Alcuni dei comandi descritti di seguito sono stati progettati per l'interfaccia del compilatore e non sono facili da manipolare per un utente umano.
Mikeserv,

2
Dico dcanche che è una lingua. ad es. codegolf.stackexchange.com/a/47921/11259
Digital Trauma

1
@DigitalTrauma Sostenere che non è una lingua sarebbe assurdo poiché ha un lexer e un parser. Ma sostenere che è leggibile dall'uomo, dato quell'esempio, sarebbe assurdo. Voglio dire ... accidenti.
Parthian Shot

1
@ParthianShot Concordato. La mia lettura di "dc è una calcolatrice mentre bc è una lingua reale" è che slm implica che dc non è una lingua, con cui non sono d'accordo. Ma potrei leggere male la risposta ...
Digital Trauma,

0

Secondo la mia modesta opinione e nel minor numero di parole possibile, GNU dc differisce da GNU bc in 3 modi:

1) Se la libreria matematica di bc non è preoccupante, per salvare quante più combinazioni di tasti possibili (nelle parole di Jan Łukasiewicz: una notazione senza parentesi) quando si fa l'aritmetica elementare, concentrarsi maggiormente sull'essenziale ed evitare distrazioni.

2) Nella riga di comando di Microsoft Windows 7, GNU dc consuma meno memoria (~ 320K) rispetto a GNU bc (~ 360K).

3) Molto controllo granulare in GNU cc che in GNU bc, ad esempio, i comandi stack e register sono assenti da GNU bc.

La versione 1.07.1 win32 per entrambi è disponibile su https://embedeo.org/ws/command_line/bc_dc_calculator_windows/

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.