Risposte:
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 dc
dell'uso è:
echo '3 4 * p' | dc
Dove p
è richiesto per stampare il risultato del calcolo. bc
d'altra parte usa la notazione infix più familiare ed è quindi più intuitivo da usare. Ecco un esempio di bc
utilizzo:
echo '3 * 4' | bc
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). dc
può 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 +p
flusso allo stream, ad esempio:
{ gen_nums; echo +p } | dc
Ma con bc
esso è 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
gen_nums
esempio in modo orribilmente complesso usando bc
. Potrebbe essere semplificato per:gen_nums | paste -sd+ | bc
bc
era solo uno strumento di front-end che compilava la bc
notazione alla notazione dc
e la convogliava dc
per ottenere il risultato. Su FreeBSD c'è ancora la -c
bandiera per la bc
quale puoi ancora compilare l' eco della dc
notazione . 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
dc
stai usando? Su Ubuntu 14.04 e OS X, l' +
operatore opera sempre su esattamente due valori dallo stack
bc -c
fa qualcosa di strano e diverso (e la -c
bandiera 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
).
Una differenza fondamentale tra i due è che dc
usa la notazione polacca inversa . Richiede comandi espliciti anche per produrre un output.
Puoi aggiungere due numeri interi bc
dicendo:
bc <<< "2+4"
e produrrebbe 6
su una linea da solo. Tuttavia, dc
dovresti 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"
dc
è una calcolatrice mentre bc
è una lingua reale. Vedi le loro pagine man.
avanti Cristodc è 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.
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.
dc
essere una calcolatrice notazione polacca inversa e da allora ho sempre usato HP inversa calcolatrici Polish Notation Io in realtà preferisco usare dc
per bc
ma 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.
bc
era una lingua nel senso che rendeva l'essere dc
umano, non che fosse più potente. In questi giorni le app condividono le librerie, ma sono bc
state chiamate una lingua e dc
una calcolatrice perché dc
facevano matematica e bc
parlavano matematica dc
. Ecco una man
pagina 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.
dc
anche che è una lingua. ad es. codegolf.stackexchange.com/a/47921/11259
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/
expr
molto spesso per semplici calcoli sulla riga di comando e negli script.