Este artículo incluye una lista de referencias generales , pero carece de suficientes citas en línea correspondientes . ( Junio de 2013 ) |
Desarrollador(es) | Robert Morris y Lorinda Cherry de Bell Labs |
---|---|
Lanzamiento inicial | 1975, hace 48-49 años |
Sistema operativo | Unix , similar a Unix , Plan 9 , FreeDOS |
Plataforma | Multiplataforma |
Tipo | Dominio |
bc , para calculadora básica , es "un lenguaje de calculadora de precisión arbitraria " con una sintaxis similar al lenguaje de programación C. bc se utiliza normalmente como un lenguaje de programación matemático o como un shell matemático interactivo.
Un uso interactivo típico es escribir el comando bc
en un símbolo del sistema de Unix e ingresar una expresión matemática, como , con lo cual(1 + 3) * 2
8se generará. Si bien bc puede funcionar con precisión arbitraria, en realidad tiene como valor predeterminado cero dígitos después del punto decimal, por lo que la expresión 2/3
da como resultado0(los resultados se truncan, no se redondean). Esto puede sorprender a los nuevos usuarios de bc que no conocen este hecho. La -l
opción de bc establece la escala predeterminada (dígitos después del punto decimal) en 20 y agrega varias funciones matemáticas adicionales al lenguaje.
bc apareció por primera vez en la versión 6 de Unix en 1975. Fue escrito por Lorinda Cherry de Bell Labs como una interfaz para dc , una calculadora de precisión arbitraria escrita por Robert Morris y Cherry. dc realizaba cálculos de precisión arbitraria especificados en notación polaca inversa . bc proporcionaba una interfaz de lenguaje de programación convencional para la misma capacidad a través de un compilador simple (un solo archivo fuente yacc que comprendía unos cientos de líneas de código), que convertía una sintaxis similar a C en notación dc y canalizaba los resultados a través de dc.
En 1991, POSIX definió y estandarizó rigurosamente bc. Cuatro implementaciones de este estándar sobreviven hoy: La primera es la implementación tradicional de Unix, un front-end para dc, que sobrevive en sistemas Unix y Plan 9. La segunda 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 bytecode ). La tercera es una reimplementación de OpenBSD en 2003. La cuarta es una implementación independiente de Gavin Howard [1] que está incluida en Android (sistema operativo) , [2] [3] FreeBSD a partir de 13.3-RELEASE, [4] [5] [6] y macOS a partir de 13.0. [7] [8] [9]
El lenguaje bc estandarizado POSIX se escribe tradicionalmente como un programa en el lenguaje de programación dc para proporcionar un mayor nivel de acceso a las características del lenguaje dc sin las complejidades de la sintaxis concisa de dc.
En esta forma, el lenguaje bc contiene nombres de variables , matrices y funciones de una sola letra y la mayoría de los operadores aritméticos estándar, así como las conocidas construcciones de flujo de control ( , y ) de C. A diferencia de C, una cláusula no puede ser seguida por un .if(cond)...
while(cond)...
for(init;cond;inc)...
if
else
Las funciones se definen mediante una define
palabra clave y sus valores se devuelven mediante un return
seguido del valor de retorno entre paréntesis. La auto
palabra clave (opcional en C) se utiliza para declarar una variable como local a una función.
Todos los números y contenidos variables son números de precisión arbitraria cuya precisión (en decimales) está determinada por la scale
variable global.
La base numérica de las constantes de entrada (en modo interactivo), salida y programa se puede especificar configurando las variables reservadas ibase
(base de entrada) y obase
(base de salida).
La salida se genera al no asignar deliberadamente el resultado de un cálculo a una variable.
Se pueden agregar comentarios al código bc mediante el uso de los símbolos C /*
y */
(comentario de inicio y final).
Los siguientes operadores POSIX bc se comportan exactamente igual que sus contrapartes de C:
+ - * /+= -= *= /=++ -- < >== != <= >=( ) [ ] { }
Los operadores de módulo%
y %=
se comportan exactamente como sus contrapartes de C solo cuando la scale
variable global se establece en 0, es decir, todos los cálculos son solo de números enteros. De lo contrario, el cálculo se realiza con la escala adecuada. a%b
se define como a-(a/b)*b
. Ejemplos:
$ bc bc 1.06 Copyright 1991-1994, 1997, 1998, 2000 Free Software Foundation, Inc. Este es un software libre SIN NINGUNA GARANTÍA. Para obtener más información, escriba `garantía'. scale=0; 5%3 2 scale=1; 5%3 .2 scale=20; 5%3 .000000000000000000002
Los operadores
^ ^=
superficialmente se parecen a los operadores exclusivos-or bit a bit de C , pero en realidad son los operadores de exponenciación de enteros de bc.
Es de particular interés que el uso del ^
operador con números negativos no sigue la precedencia del operador C. -2^2
da la respuesta de 4 bajo bc en lugar de −4.
Los operadores bit a bit , booleanos y condicionales :
& | ^ && ||&= |= ^= &&= ||=<< >><<= >>=?:
no están disponibles en POSIX bc.
La sqrt()
función para calcular raíces cuadradas es la única función matemática incorporada de POSIX bc. Hay otras funciones disponibles en una biblioteca estándar externa.
La scale()
función para determinar la precisión (como con la scale
variable) de su argumento y la length()
función para determinar la cantidad de dígitos decimales significativos en su argumento también están integradas.
La biblioteca matemática estándar de bc (definida con la opción -l ) contiene funciones para calcular seno , coseno , arcotangente , logaritmo natural , la función exponencial y la función de Bessel de dos parámetros J. La mayoría de las funciones matemáticas estándar (incluidas las demás funciones trigonométricas inversas) se pueden construir utilizando estas funciones. Consulte los enlaces externos para ver las implementaciones de muchas otras funciones.
Comando bc | Función | Descripción |
---|---|---|
s(x) | Seno | Toma x , un ángulo en radianes |
c(x) | Coseno | Toma x , un ángulo en radianes |
a(x) | Arcotangente | Devuelve radianes |
l(x) | Logaritmo natural | |
e(x) | Función exponencial | |
j(n,x) | Función de Bessel | Devuelve la función de Bessel de orden n de x . |
La opción -l cambia la escala a 20, [10], por lo que cosas como el módulo pueden funcionar de manera inesperada. Por ejemplo, escribir bc -l
y luego el comando print 3%2
genera 0, pero escribir scale=0
después bc -l
y luego el comando print 3%2
genera 1.
El plan 9 bc es idéntico a POSIX bc pero con una print
declaración adicional.
GNU bc deriva del estándar POSIX e incluye muchas extensiones. Es totalmente independiente de las implementaciones del estándar POSIX basadas en dc y, en cambio, está escrito en C. Sin embargo, es totalmente compatible con versiones anteriores, ya que todos los programas POSIX bc se ejecutarán sin modificaciones como programas GNU bc.
Las variables, matrices y nombres de funciones de GNU bc pueden contener más de un carácter, se han incluido algunos operadores más de C y, en particular, una if
cláusula puede ir seguida de un else
.
La salida se logra al no asignar deliberadamente un resultado de un cálculo a una variable (el método POSIX) o al utilizar la print
declaración agregada.
Además, una read
declaración permite la entrada interactiva de un número en un cálculo en ejecución.
Además de los comentarios de estilo C, un #
carácter hará que todo lo que venga después hasta la siguiente nueva línea se ignore.
El valor del último cálculo siempre se almacena dentro de la variable incorporada adicional last
.
Los siguientes operadores lógicos son adicionales a los de POSIX bc:
&& || !
Están disponibles para su uso en instrucciones condicionales (como dentro de una if
instrucción). Sin embargo, tenga en cuenta que aún no existen operaciones de asignación o bit a bit equivalentes.
Todas las funciones disponibles en GNU bc son heredadas de POSIX. No se proporcionan más funciones de manera estándar con la distribución GNU.
Dado que el operador bc ^
solo permite una potencia entera a su derecha, una de las primeras funciones que un usuario de bc podría escribir es una función de potencia con un exponente de punto flotante. Las dos funciones siguientes suponen que se ha incluido la biblioteca estándar:
/* Una función para devolver la parte entera de x */ define i ( x ) { auto s s = escala escala = 0 x /= 1 /* redondear x hacia abajo */ escala = s return ( x ) } /* Utilice el hecho de que x^y == e^(y*log(x)) */ define p ( x , y ) { if ( y == i ( y )) { return ( x ^ y ) } return ( e ( y * l ( x ) ) ) }
Calcula pi usando la función arcotangente incorporada, a() :
$ bc -lq scale=10000 4*a(1) # El atan de 1 es 45 grados, que es pi/4 en radianes. # Este cálculo puede tardar varios minutos .
Debido a que la sintaxis de bc es similar a la de C , las funciones numéricas publicadas escritas en C a menudo se pueden traducir a bc con bastante facilidad, lo que proporciona de inmediato la precisión arbitraria de bc. Por ejemplo, en el Journal of Statistical Software (julio de 2004, volumen 11, número 5), George Marsaglia publicó el siguiente código C para la distribución normal acumulativa :
doble Phi ( doble x ) { largo doble s = x , t = 0 , b = x , q = x * x , i = 1 ; mientras ( s != t ) s = ( t = s ) + ( b *= q / ( i += 2 )); devuelve .5 + s * exp ( -.5 * q -.91893853320467274178L ); }
Con algunos cambios necesarios para acomodar 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:
definir phi ( x ) { auto s , t , b , q , i , const s = x ; t = 0 ; b = x ; q = x * x ; i = 1 mientras ( s != t ) s = ( t = s ) + ( b *= q / ( i += 2 )) const = 0.5 * l ( 8 * a ( 1 )) # 0.91893 ... devuelve .5 + s * e ( - .5 * q - const ) }
bc se puede utilizar de forma no interactiva, con entrada a través de una tubería . Esto resulta útil dentro de scripts de shell . Por ejemplo:
$ resultado = $( echo "escala=2; 5 * 7 /3;" | bc ) $ echo $resultado 11.66
Por el contrario, tenga en cuenta que el shell bash solo realiza aritmética de números enteros, por ejemplo:
$ resultado = $(( 5 * 7 / 3 )) $ echo $resultado 11
También se puede utilizar el modismo here-string (en bash, ksh, csh):
$ antes de Cristo -l <<< "5*7/3" 11.66666666666666666666