bc (lenguaje de programación)
bc es un lenguaje de programación de cálculo numérico con precisión arbitraria, con una sintaxis similar a la del lenguaje de programación C.
El lenguaje y su intérprete son una herramienta estandarizada de los sistemas UNIX.
El intérprete de bc puede ser usado de forma interactiva, escribiendo expresiones como (1 + 3) * 2 que son evaluadas y su valor escrito en la salida estándar (8 en el ejemplo anterior).
Hay actualmente dos dialectos principales: el rigurosamente definido POSIX bc y un descendiente directo suyo, GNU bc, que incorpora numerosas extensiones.
bc permite la definición de funciones matemáticas. Además las implementaciones de bc incorporan una biblioteca matemática con funciones predefinidas (y estandarizadas) tales como coseno o función de Bessel.
También posee estructuras que permiten la programación estructurada tales como bucles o decisiones condicionales.
Historia
editarbc apareció por primera vez en la versión 6 de Unix en 1975 y fue escrito por Robert Morris y Lorinda Cherry de Bell Labs. bc fue precedido por dc, una calculadora de precisión arbitraria anterior escrita por los mismos autores. dc podía realizar cálculos de precisión arbitraria, pero su sintaxis de notación polaca inversa (RPN), muy apreciada por muchos para evaluar fórmulas algebraicas, resultó inconveniente para sus usuarios al expresar el control de flujo y, por lo tanto, bc se escribió como una interfaz para dc. bc era un compilador muy simple (un solo archivo fuente yacc con unos pocos cientos de líneas), que convertía la nueva sintaxis bc, similar a C, en la notación postfija de dc y canalizaba los resultados a través de dc.
En 1991, POSIX definió y estandarizó rigurosamente bc. Tres implementaciones de este estándar sobreviven hoy: la primera es la implementación tradicional de Unix, un front-end para dc, que sobrevive en los sistemas Unix y Plan 9. El segundo es el software libre GNU bc, lanzado por primera vez en 1991 por Philip A. Nelson. La implementación de GNU tiene numerosas extensiones más allá del estándar POSIX y ya no es un front-end para dc (es un intérprete de código de bytes). El tercero es una reimplementación de OpenBSD en 2003.
Ejemplos
editarCálculos simples
editarbc 5+2*3 ^D
Algo un poco más complejo:
bc b=1 for (a=5;a>1;a--) b=b*a ^D
Funciones parte entera y exponencial
editarA continuación se presentarán dos funciones, i y p. La función i devuelve la parte entera de cualquier número; y la función p (que se apoya en la anterior función) calcula:
permitiendo que y sea cualquier número (no solamente un entero).
/* Una función que devuelve la parte entera de x */
define i((x)) {
auto s
s = scale
scale = 0
x /= 1 /* redondea x */
scale = s
return (x)
}
/* x^y == e^(y*log(x)) */
define p(x,y) {
if (y == i(y)) {
return (x ^ y)
}
return ( e( y * l(x) ) )
}
Cálculo de π con 10000 dígitos
editarCalculate pi usando la función incorporada arcotangente, a():
$ bc -lq
scale=10000
4*a(1) # The atan of 1 is 45 degrees, which is pi/4 in radians.
# This may take several minutes to calculate.
Función en C traducida
editarDebido a que la sintaxis de bc es similar a la del lenguaje de programación C, las funciones numéricas escritas en C a menudo se pueden traducir a bc con bastante facilidad. Por ejemplo, el siguiente código C para la distribución normal acumulativa:
double Phi(double x)
{
long double s=x,t=0,b=x,q=x*x,i=1;
while(s!=t)
s=(t=s)+(b*=q/(i+=2));
return .5+s*exp(-.5*q-.91893853320467274178L);
}
Con algunos cambios necesarios para adaptarse a la sintaxis diferente de bc, y teniendo en cuenta que la constante "0.9189 ..." es en realidad log (2 * PI) / 2, esto se puede traducir al siguiente código GNU bc:
define phi(x) {
auto s,t,b,q,i,const
s=x; t=0; b=x; q=x*x; i=1
while(s!=t)
s=(t=s)+(b*=q/(i+=2))
const=0.5*l(8*a(1)) # 0.91893...
return .5+s*e(-.5*q-const)
}
Usando bc en scripts de shell
editarbc se puede utilizar de forma no interactiva Esto es útil dentro de script de shells. Por ejemplo:
$ resultado=$(echo "scale=2; 5 * 7 /3;" | bc)
$ echo $resultado
11.66
Por el contrario, tenga en cuenta que el shell bash solo realiza aritmética de enteros. Por ejemplo:
$ resultado=$((5 * 7 /3))
$ echo $resultado
11
También se puede utilizar el Here document (en bash, ksh, csh):
$ bc -l <<< "5*7/3"
11.66666666666666666666
Como en el caso anterior, pero con dos decimales:
$ bc -l <<< "scale=2; 5*7/3"
11.66
Referencias
editar- bc: arbitrary-precision arithmetic language – Comandos y utilidades Referencia, Single Unix Specification, Issue 7 de The Open Group
- GNU bc manual page
- POSIX bc manual page
- bc(1) – Comandos generales en el manual de Plan 9 from Bell Labs (en inglés)
- 7th Edition Unix bc manual page Archivado el 8 de octubre de 2006 en Wayback Machine.
- A comp.compilers article on the design and implementation of C-bc
- 6th Edition Unix bc source code, the first release of bc, from May 1975, compiling bc syntax into dc syntax
- bc source code
Enlaces externos
editar- Wikilibros alberga un libro o manual sobre Commands.
- Dittmer, I. 1993. Error in Unix commands dc and bc for multiple-precision-arithmetic. SIGNUM Newsl. 28, 2 (Apr. 1993), 8–11.
- Collection of useful GNU bc functions
- GNU bc (and an alpha version) from the Free Software Foundation
- bc for Windows from GnuWin32
- X-bc - A Graphical User Interface to bc
- extensions.bc - contains functions of trigonometry, exponential functions, functions of number theory and some mathematical constants
- scientific_constants.bc - contains particle masses, basic constants, such as speed of light in the vacuum and the gravitational constant