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 dc
uso é:
echo '3 4 * p' | dc
Onde p
é necessário imprimir o resultado do cálculo. bc
por outro lado, usa a notação infix mais familiar e, portanto, é mais intuitivo de usar. Aqui está um exemplo de bc
uso:
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). dc
ainda 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 bc
isso é 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_nums
exemplo terrivelmente complexo usando bc
. Pode ser simplificada para:gen_nums | paste -sd+ | bc
bc
era apenas uma ferramenta de front-end que compilava a bc
notação dc
e a canalizava dc
para obter o resultado. No FreeBSD ainda existe o -c
sinalizador para o bc
qual você ainda pode compilar com a dc
notaçã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
dc
você está usando? No Ubuntu 14.04 e OS X, o +
operador sempre opera com exatamente dois valores fora da pilha
dc
uso: gen_nums_nonnegative | dc -e '0 0 [+?z1<m]dsmxp'
. Este script para dc
lê e adiciona números um a um no loop e depois imprime o resultado. Veja a nota sobre números negativos.
bc -c
faz 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 dc
usa a notação polonesa reversa . Requer comandos explícitos mesmo para produzir uma saída.
Você pode adicionar dois números inteiros bc
dizendo:
bc <<< "2+4"
e produziria 6
em uma linha por si só. No entanto, dc
você 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.
dc
ser 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, bc
mas 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.
bc
era uma linguagem no sentido de tornar dc
amigável ao ser humano - não que fosse mais poderosa. Estes dias os aplicativos compartilhar libs, mas bc
foi chamado de linguagem e dc
uma calculadora porque dc
fez matemática e bc
falou matemática - a dc
. Aqui está uma man
pá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.
dc
també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/
expr
com frequência para cálculos simples na linha de comando e em scripts.