Qual a diferença entre bc e dc?

27

Quais são as diferenças entre dce bccalculadoras?

Quando devo usar dce quando bc?

sintagma
fonte
Eu uso exprcom frequência para cálculos simples na linha de comando e em scripts.
Matt Bianco

Respostas:

34

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

Qual usar?

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
Graeme
fonte
10
Você transformou o gen_numsexemplo terrivelmente complexo usando bc. Pode ser simplificada para:gen_nums | paste -sd+ | bc
devnull
14
Curiosidade: Tradicionalmente, 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
Raphael Ahrens
14
Hmm, o que dcvocê está usando? No Ubuntu 14.04 e OS X, o +operador sempre opera com exatamente dois valores fora da pilha
Digital Trauma
2
O exemplo correcta de 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.
Ruvim 19/10/2015
11
@RaphaelAhrens Interessante, no macOS 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).
Konrad Rudolph
9

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"

devnull
fonte
"Bc foi escrito como um front-end para Dc"
Adam
3

dc é uma calculadora enquanto bc é uma linguagem real. Veja suas páginas de manual.

dc

dc é 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

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.

slm
fonte
3
@REACHUS - Não sei ao certo o que você está perguntando? Por 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.
Slm
3
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.
mikeserv
2
Eu afirmo que dctambém é uma linguagem. por exemplo, codegolf.stackexchange.com/a/47921/11259
Trauma digital
11
@DigitalTrauma Argumentar que não é uma linguagem seria absurdo, pois possui um lexer e um analisador. Mas argumentar que é legível por humanos, dado esse exemplo, seria absurdo. Quero dizer ... caramba.
Parthian Shot
11
@ParthianShot concordou. Minha leitura de "dc é uma calculadora enquanto bc é uma linguagem real" é que slm está implicando que dc não é uma linguagem, da qual discordo. Mas eu só poderia estar lendo na resposta errada ...
Digital Trauma
0

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/

bc_vs._dc
fonte