Respostas:
dcé uma ferramenta muito arcaica e um pouco mais antiga que bc. Para citar a página da Wikipedia :
É um dos utilitários Unix mais antigos, anterior à invenção da linguagem de programação C; como outros utilitários desse vintage, ele possui um poderoso conjunto de recursos, mas uma sintaxe extremamente concisa.
A sintaxe é uma notação de polimento reverso, o que basicamente significa que os argumentos (ou seja, números) vêm primeiro, seguidos pelo operador. Um exemplo básico do dcuso é:
echo '3 4 * p' | dc
Onde pé necessário imprimir o resultado do cálculo. bcpor outro lado, usa a notação infix mais familiar e, portanto, é mais intuitivo de usar. Aqui está um exemplo de bcuso:
echo '3 * 4' | bc
bcé padronizado pelo POSIX e, portanto, é provavelmente o mais portátil dos dois (pelo menos nos sistemas modernos). Se você estiver trabalhando com uma calculadora manual, é definitivamente a escolha (a menos que você seja um masoquista). dcainda pode ter seus usos, aqui está um caso em que a notação de polimento reverso é útil. Imagine que você tem um programa que gera um fluxo de números que você deseja totalizar, por exemplo:
23
7
90
74
29
To do this with dc is very simple (at least with modern implementations where each operator can take more than two numbers) since you only have to append a +p to the stream, eg:
{ gen_nums; echo +p } | dc
Mas com bcisso é mais complexo, pois precisamos não apenas colocar um + entre cada número e garantir que tudo esteja na mesma linha, mas também garantir que haja uma nova linha no final:
{ gen_nums | sed '$ !s/$/+/' | tr -d '\n'; echo; } | bc
gen_numsexemplo terrivelmente complexo usando bc. Pode ser simplificada para:gen_nums | paste -sd+ | bc
bcera apenas uma ferramenta de front-end que compilava a bcnotação dce a canalizava dcpara obter o resultado. No FreeBSD ainda existe o -csinalizador para o bcqual você ainda pode compilar com a dcnotação . For example eco '3 * 4' | bc` é igual a echo '3 * 4' | bc -c | dc. Veja linux.die.net/man/1/bc e freebsd.org/cgi/man.cgi?query=bc&sektion=1
dcvocê está usando? No Ubuntu 14.04 e OS X, o +operador sempre opera com exatamente dois valores fora da pilha
dcuso: gen_nums_nonnegative | dc -e '0 0 [+?z1<m]dsmxp'. Este script para dclê e adiciona números um a um no loop e depois imprime o resultado. Veja a nota sobre números negativos.
bc -cfaz algo estranho e diferente (e o-c bandeira não é documentada). Se eu tentar canalizá-lo dc, recebo vários erros (e a saída sem canalizar dcé muito enigmática @iK3:K4:*W@r\n@i).
Uma diferença básica entre os dois é que dcusa a notação polonesa reversa . Requer comandos explícitos mesmo para produzir uma saída.
Você pode adicionar dois números inteiros bcdizendo:
bc <<< "2+4"
e produziria 6em uma linha por si só. No entanto, dcvocê precisa dizer:
dc <<< "2 4 +p"
Você também pode fazer muita coisa divertida usando dc, por exemplo, consulte a minha resposta aqui para produzir
Hello World!
usando dc .
dc <<< "8 9 * P101P108P108P111P4 8 * P81 6 + P111P114P108P100P33P"
dc é uma calculadora enquanto bc é uma linguagem real. Veja suas páginas de manual.
bcdc é uma calculadora de mesa com polimento reverso que suporta aritmética de precisão ilimitada. Também permite definir e chamar macros. Normalmente, dc lê da entrada padrão; se algum argumento de comando é fornecido, eles são nomes de arquivos e o dc lê e executa o conteúdo dos arquivos antes de ler da entrada padrão. Toda saída normal é para saída padrão; toda a saída de erro é para erro padrão.
bc é uma linguagem que suporta números de precisão arbitrários com execução interativa de instruções. Existem algumas semelhanças na sintaxe com a linguagem de programação C. Uma biblioteca matemática padrão está disponível por opção de linha de comando. Se solicitado, a biblioteca de matemática é definida antes de processar qualquer arquivo. bc começa processando o código de todos os arquivos listados na linha de comandos na ordem listada. Depois que todos os arquivos foram processados, o bc lê da entrada padrão. Todo o código é executado conforme é lido. (Se um arquivo contiver um comando para interromper o processador, o bc nunca lerá a partir da entrada padrão.)
Realmente depende do que você quer fazer matematicamente. Algumas operações não são possíveis usando dc. Eu usei os dois ao longo dos anos, além de várias outras ferramentas de calculadora de linha de comando. Consulte " Solucionador de expressões de linha de comando? " Para obter alguns exemplos adicionais.
dcser uma calculadora de notação de polimento reverso, e como sempre usei calculadoras de notação de polimento reverso da HP, prefiro usá dc-lo, bcmas eu diria que elas ainda são usadas sempre que você precisar executar um cálculo matemático complexo. Costumo usá-los para converter números entre a base 10 e a base 16 e a base 2. Mas os usei para registrar colunas em dados tabulares e também de um script AWK.
bcera uma linguagem no sentido de tornar dcamigável ao ser humano - não que fosse mais poderosa. Estes dias os aplicativos compartilhar libs, mas bcfoi chamado de linguagem e dcuma calculadora porque dcfez matemática e bcfalou matemática - a dc. Aqui está uma manpágina antiga : Uma linguagem chamada BC[1] foi desenvolvida que aceita programas escritos em linguagens de nível superior e compila a saída que é interpretada pelo DC. Alguns dos comandos descritos abaixo foram projetados para a interface do compilador e não são fáceis para um usuário humano manipular.
dctambém é uma linguagem. por exemplo, codegolf.stackexchange.com/a/47921/11259
Na minha humilde opinião e com o mínimo de palavras possível, o GNU dc difere do GNU bc de três maneiras:
1) Se a biblioteca de matemática da bc estiver preocupada, salve o máximo de teclas possível (nas palavras de Jan Łukasiewicz: uma notação sem parênteses) ao fazer aritmética elementar, para se concentrar mais no essencial e para evitar distrações.
2) Na linha de comando do Microsoft Windows 7, o GNU dc consome menos memória (~ 320K) do que o GNU bc (~ 360K).
3) Muito controle granular no GNU dc do que no GNU bc, por exemplo, comandos de pilha e registro estão ausentes no GNU bc.
A versão 1.07.1 win32 para ambos está em https://embedeo.org/ws/command_line/bc_dc_calculator_windows/
exprcom frequência para cálculos simples na linha de comando e em scripts.