stringtranslate.com

bc (lenguaje de programación)

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.

Descripción general

Un uso interactivo típico es escribir el comando bcen un símbolo del sistema de Unix e ingresar una expresión matemática, como , con lo cual(1 + 3) * 28se 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/3produce0(los resultados se truncan, no se redondean). Esto puede sorprender a los nuevos usuarios de bc que no conocen este hecho. La -lopció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.

Historia

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]

Implementaciones

POSIX, código binario

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)...ifelse

Las funciones se definen mediante una definepalabra clave y sus valores se devuelven mediante un returnseguido del valor de retorno entre paréntesis. La autopalabra 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 scalevariable 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).

Operadores matemáticos

Exactamente como C

Los siguientes operadores POSIX bc se comportan exactamente igual que sus contrapartes de C:

+ - * /+= -= *= /=++ -- < >== != <= >=( ) [ ] { }
Similar a C

Los operadores de módulo% y %=se comportan exactamente como sus contrapartes de C solo cuando la scalevariable 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%bse 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
En conflicto con C

Los operadores

^ ^=

superficialmente se parecen a los operadores exclusivos-o bit a bit de C , pero en realidad son los operadores de exponenciación de enteros de bc.

Es de destacar que el uso del ^operador con números negativos no sigue la precedencia del operador C. -2^2da la respuesta de 4 bajo bc en lugar de −4.

Operadores "faltantes" en relación con C

Los operadores bit a bit , booleanos y condicionales :

& | ^ && ||&= |= ^= &&= ||=<< >><<= >>=?:

no están disponibles en POSIX bc.

Funciones integradas

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 scalevariable) 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.

Funciones de la biblioteca estándar

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.

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 -ly luego el comando print 3%2genera 0, pero escribir scale=0después bc -ly luego el comando print 3%2genera 1.

Plan 9 a. C.

El plan 9 bc es idéntico a POSIX bc pero con una printdeclaración adicional.

GNU bc

GNU bc deriva del estándar POSIX e incluye muchas mejoras. 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 ifclá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 printdeclaración agregada.

Además, una readdeclaració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.

Operadores adicionales

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 ifinstrucción). Sin embargo, tenga en cuenta que aún no existen operaciones de asignación o bit a bit equivalentes.

Funciones

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.

Código de ejemplo

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 de "potencia" en POSIX bc

 /* 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 )  )  )  }

Calcular π hasta 10000 dígitos

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 .  

Una función C traducida

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 ) }

Uso de bc en scripts de shell

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):

$ bc  -l <<< "5*7/3" 11.66666666666666666666  

Véase también

Referencias

  1. ^ Una implementación de Unix dc y POSIX bc con extensiones GNU y BSD
  2. ^ "El shell y las utilidades de Android". android.googlesource.com .
  3. ^ "Plataforma/Externo/Bc - Git en Google".
  4. ^ "FreeBSD 13.3: ¿Qué novedades hay y cómo llegamos hasta aquí?". Foros de FreeBSD . 5 de marzo de 2024.
  5. ^ "bc(1)". man.freebsd.org .
  6. ^ "bc « contrib - src - árbol de fuentes de FreeBSD". cgit.freebsd.org .
  7. ^ "Código abierto de Apple". opensource.apple.com .
  8. ^ "bc/bc en main · apple-oss-distributions/bc". GitHub .
  9. ^ "¡Mi código conquistó otro sistema operativo! | Gavin D. Howard".
  10. ^ ab bc: lenguaje aritmético de precisión arbitraria – Referencia de shell y utilidades, La especificación única de UNIX , versión 4 de The Open Group

Enlaces externos