¿En qué se diferencia bc de dc?

27

¿Cuáles son las diferencias entre dcy bccalculadoras?

¿Cuándo debo usar dcy cuándo bc?

sintagma
fuente
Lo uso exprmuy a menudo para cálculos simples en la línea de comandos y en los scripts.
MattBianco

Respuestas:

34

dcEs una herramienta muy arcaica y algo más antigua que bc. Para citar la página de Wikipedia :

Es una de las utilidades más antiguas de Unix, anterior incluso a la invención del lenguaje de programación C; Al igual que otras utilidades de esa época, tiene un poderoso conjunto de características pero una sintaxis extremadamente concisa.

La sintaxis es una notación de pulido inverso, lo que básicamente significa que los argumentos (es decir, los números) vienen primero seguidos por el operador. Un ejemplo básico del dcuso es:

echo '3 4 * p' | dc

Donde pse requiere para imprimir el resultado del cálculo. bcpor otro lado usa la notación infija más familiar y por lo tanto es más intuitiva de usar. Aquí hay un ejemplo de bcuso:

echo '3 * 4' | bc

¿Cuál usar?

bcestá estandarizado por POSIX y probablemente sea el más portátil de los dos (al menos en los sistemas modernos). Si está haciendo un trabajo de calculadora manual, definitivamente es la opción (a menos que sea un poco masoquista). dcSin embargo, todavía puede tener sus usos, aquí hay un caso en el que la notación de pulido inverso es útil. Imagine que tiene un programa que genera una secuencia de números que desea sumar, por ejemplo:

23
7
90
74
29

Hacer esto dces muy simple (al menos con implementaciones modernas donde cada operador puede tomar más de dos números) ya que solo tiene que agregar un +pa la secuencia, por ejemplo:

{ gen_nums; echo +p } | dc

Pero con bcesto es más complejo, ya que no solo necesitamos poner un + entre cada número y asegurarnos de que todo esté en la misma línea, sino también asegurarnos de que haya una nueva línea al final:

{ gen_nums | sed '$ !s/$/+/' | tr -d '\n'; echo; } | bc
Graeme
fuente
10
Has convertido el gen_numsejemplo en un uso terriblemente complejo bc. Se podría simplificarse a:gen_nums | paste -sd+ | bc
devnull
14
Dato curioso: Tradicionalmente bcera solo una herramienta front-end que compilaba la bcnotación a la notación de dcy la canalizaba dcpara obtener el resultado. En FreeBSD todavía existe la -cbandera bccon la que aún puede compilar la dcnotación . For example echo '3 * 4' | bc` es igual a echo '3 * 4' | bc -c | dc. Ver el linux.die.net/man/1/bc y freebsd.org/cgi/man.cgi?query=bc&sektion=1
Raphael Ahrens
14
Hmm, que dcestá usando? En Ubuntu 14.04 y OS X, el +operador siempre opera con exactamente dos valores fuera de la pila
Digital Trauma
2
El ejemplo correcto de dcuso: gen_nums_nonnegative | dc -e '0 0 [+?z1<m]dsmxp'. Este script dclee y agrega números uno por uno en bucle y luego imprime el resultado. Ver la nota sobre números negativos.
ruvim
1
@RaphaelAhrens Interesante, en macOS bc -chace algo extraño y diferente (y la -cbandera no está documentada). Si trato de canalizarlo dc, obtengo un montón de errores (y la salida sin canalizar dces muy críptica @iK3:K4:*W@r\n@i).
Konrad Rudolph el
9

Una diferencia básica entre los dos es que dcusa la notación polaca inversa . Requiere comandos explícitos incluso para producir una salida.

Puede agregar dos enteros bcdiciendo:

bc <<< "2+4"

y produciría 6en una línea por sí mismo. Sin embargo, en dctendrías que decir:

dc <<< "2 4 +p"

También puede hacer cosas muy divertidas usando dc, por ejemplo, consulte mi respuesta aquí para producir

Hello World!

utilizando dc.

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

devnull
fuente
"Bc fue escrito como un front-end para Dc"
Adam
3

dces una calculadora mientras que bces un lenguaje real. Ver sus páginas de manual.

corriente continua

dc es una calculadora de escritorio de pulido inverso que admite aritmética de precisión ilimitada. También le permite definir y llamar macros. Normalmente dc lee de la entrada estándar; si se le dan argumentos de comando, son nombres de archivo, y dc lee y ejecuta el contenido de los archivos antes de leerlo desde la entrada estándar. Toda salida normal es a salida estándar; toda salida de error es a error estándar.

antes de Cristo

bc es un lenguaje que admite números de precisión arbitrarios con ejecución interactiva de declaraciones. Hay algunas similitudes en la sintaxis con el lenguaje de programación C. Una biblioteca matemática estándar está disponible mediante la opción de línea de comando. Si se solicita, la biblioteca matemática se define antes de procesar cualquier archivo. bc comienza procesando el código de todos los archivos enumerados en la línea de comando en el orden indicado. Después de que se hayan procesado todos los archivos, bc lee desde la entrada estándar. Todo el código se ejecuta a medida que se lee. (Si un archivo contiene un comando para detener el procesador, bc nunca leerá desde la entrada estándar).

Realmente depende de lo que finalmente quieras hacer matemáticamente. Algunas operaciones no son posibles usando dc. He usado ambos a lo largo de los años además de varias otras herramientas de calculadora de línea de comandos. Consulte " Solucionador de expresiones de línea de comando? " Para ver algunos ejemplos adicionales.

slm
fuente
3
@REACHUS - ¿No estoy seguro de entender lo que estás preguntando? Debido a dcser una calculadora de notación polaca inversa y desde siempre he utilizado HP inversa calculadoras de notación polaca en realidad prefieren usar dca bc, pero yo diría que ambos son usados en cualquier momento todavía es necesario realizar un cálculo matemático complejo. A menudo los uso para convertir números en blanco y negro de base 10 a base 16 y base 2. Pero los he usado para contar columnas en datos tabulares también desde un script AWK.
slm
3
bcera un lenguaje en el sentido de que lo hacía dcamigable para los humanos, no es que fuera más poderoso. En estos días, las aplicaciones comparten bibliotecas, pero bcse llamaba un idioma y dcuna calculadora porque dchacía matemáticas y bchablaba de matemáticas dc. Aquí hay una manpágina anterior : se ha desarrollado un lenguaje llamado BC[1] que acepta programas escritos en lenguajes de nivel superior y compila resultados que DC interpreta. Algunos de los comandos descritos a continuación fueron diseñados para la interfaz del compilador y no son fáciles de manipular por un usuario humano.
mikeserv
2
Afirmo dcque también es un idioma. por ejemplo codegolf.stackexchange.com/a/47921/11259
Digital Trauma
1
@DigitalTrauma Argumentar que no es un lenguaje sería absurdo ya que tiene un lexer y un analizador sintáctico. Pero argumentar que es legible para los humanos, dado ese ejemplo, sería absurdo. Quiero decir ... maldición.
Parthian Shot
1
@ParthianShot De acuerdo. Mi lectura de "dc es una calculadora, mientras que bc es un lenguaje real" es que slm implica que dc no es un idioma, con lo que no estoy de acuerdo. Pero podría estar leyendo la respuesta incorrecta ...
Digital Trauma
0

En mi humilde opinión y en la menor cantidad de palabras posible, GNU dc difiere de GNU bc en 3 formas:

1) Si la biblioteca matemática de bc no le preocupa, guardar tantas pulsaciones de teclas como sea posible (en palabras de Jan Łukasiewicz: una notación sin paréntesis) al hacer aritmética elemental, para concentrarse más en lo esencial y evitar distracciones.

2) En la línea de comandos de Microsoft Windows 7, GNU dc consume menos memoria (~ 320K) que GNU bc (~ 360K).

3) Mucho control granular en GNU dc que en GNU bc, por ejemplo, los comandos de pila y registro están ausentes de GNU bc.

La versión 1.07.1 win32 para ambos está en https://embedeo.org/ws/command_line/bc_dc_calculator_windows/

bc_vs._dc
fuente