Haga matemáticas en el shell de Linux con GNU bc

Permitidme que hoy os hable de cómo prácticar las matemáticas en la shell de GNU/Linux con GNU bc. Esta entrada es una adaptación del inglés de la entrada inicialmente publicada en el excelente portal opensource.com por el autor Seth Kenion, utilizando la licencia Creative Commons BY-SA.  Al final de la entrada tenéis las fuentes.

Créditos de imagen: Flickr, by Anssi Koskinen CC BY 2.0

La mayoría de los sistemas POSIX vienen con GNU bc, un lenguaje de procesamiento numérico de precisión arbitraria. Su sintaxis es similar a C, pero también admite la ejecución interactiva de declaraciones y el procesamiento de datos desde estándar en (stdin). Por esa razón, a menudo es la respuesta a la pregunta, «¿Cómo hago matemáticas en el shell de Linux?» Este estilo de respuesta es común en línea:

$ echo "1+1" | bc
2

Si bien eso es perfectamente válido, pocos usuarios argumentan que es elegante en comparación con algo más intuitivo, como:

$ 1+1  #esto no funciona
2

El modo interactivo es un poco más sencillo:

$ bc
1+1
2
quit
$

Pero los modos interactivos no siempre se ajustan al flujo de trabajo intuitivo y deseado de algo simple, como simplemente escribir el cálculo que desea. Para ello, sugiero la calculadora de Bluebat en puro Bash.

Lo que bc ofrece en realidad es un lenguaje matemático para cálculos avanzados.

Funciones avanzadas con mathlib

Por sí solo, bc proporciona funciones matemáticas básicas. Puede probarlos en el modo interactivo:

$ bc
3^2
9
(3^2)*(9)/3
27

Utilice la opción --mathlib para obtener funciones avanzadas, como seno, coseno, tangente y más. En el modo interactivo, puede probar algunos de ellos. Aquí está el coseno de 90:

c(90)
-.44807361612917015236

El seno de 9:

s(9)
.41211848524175656975

Creando tus propias funciones bc

También puede crear sus propias funciones en bc. Las definiciones de función comienzan con la palabra clave define y se incluyen entre llaves. Aquí hay una función simple ingresada en una sesión interactiva que devuelve cualquier número que se le dé:

$ bc
define echo(n) {
  return (n);
}

En la misma sesión interactiva, pruébelo:

echo(2)
2
echo(-2)
-2

Declaraciones If en bc

El lenguaje bc también tiene una variedad de declaraciones de control, la más simple de las cuales es if / else. La sintaxis puede parecer familiar a primera vista, pero hay sutilezas en cómo se manejan las llaves. Tenga en cuenta que la cláusula else de una sentencia if está entre llaves, mientras que la cláusula then no lo está, pero ambas terminan con un punto y coma. Aquí hay una función para encontrar el valor absoluto de un número n:

define abso(n) {
  if ( n > 0 ) return (n);
  { return (-n); }
}

En la misma sesión interactiva, pruébelo:

abso(-5)
5
abso(5)
5

Importando datos a bc

Trabajar en una sesión interactiva es tolerable para realizar cálculos rápidos y experimentar, pero pierde sus datos cuando sale y es difícil editarlos cuando comete errores. Afortunadamente, bc puede cargar variables y funciones desde archivos externos.

Aquí hay un archivo que contiene dos variables (sol y foo) y una función abso personalizada para encontrar un valor absoluto:

sol=299792458
 
foo=42
 
define abso(n) {
  if ( n > 0 ) return (n);
  { return (-n); }
}

Guarde esto en un archivo llamado bcvars.bc, para que pueda importarlo a una sesión interactiva de bc:

$ bc bcvars.bc
foo
42
sol
299792458
abso(-23)
23

Mejora tus matemáticas con bc

El lenguaje bc es relativamente simple, siempre que sepa lo suficiente de matemáticas para construir la ecuación para lo que sea que esté tratando de lograr. Si bien bc de forma predeterminada proporciona funciones básicas útiles y le permite crear las suyas propias, puede reducir su carga de trabajo colocándose sobre los hombros de gigantes. Los archivos cargados con nuevas funciones, tanto para los fundamentos matemáticos como para tareas específicas (por ejemplo, calcular el interés compuesto), están disponibles en la página GNU bc, y la documentación completa para bc está disponible.

Si está interesado en mejorar las matemáticas en un shell, intente bc. No te convertirá en un genio de las matemáticas, pero podría hacer que sea más fácil convertirte en uno.

Entradas relacionadas:

Aplicaciones científicas para GNU Linux – Matemáticas

Fuentes consultadas

Tal y como he comentado al principio de la entrada adjunto enlace a la entrada original, además de información sobre su licencia:

Opensource.com – Do math in the Linux shell with GNU bc

How and why to use Creative Commons licensed work