BC: multiplicación automática de precisión completa


10

Alto, necesito probar mi calculadora de precisión arbitraria, y bcparece un buen criterio para comparar, sin embargo, bctrunca el resultado de cada multiplicación a lo que parece ser la escala máxima de los operandos involucrados.

¿Hay alguna forma rápida de desactivar esto o de configurar automáticamente la escala de cada multiplicación a la suma de las escalas de los factores para que no pierda precisión?

Si tiene una solución más elegante para esto que involucra algo diferente bc, le agradecería que lo comparta.

Ejemplo:

$ bc <<< '1.5 * 1.5'
2.2

La respuesta real es 2.25.


Estrechamente relacionado con la operación de flotación con bc? .
manatwork

Respuestas:


12

Puede controlar la escala que bcsale con el scale=<#>argumento.

$ echo "scale=10; 5.1234 * 5.5678" | bc
28.52606652

$ echo "scale=5; 5.1234 * 5.5678" | bc
28.52606

Usando tu ejemplo:

$ bc <<< 'scale=2; 1.5 * 1.5'
2.25

También puede usar el -linterruptor (gracias a @manatwork) que inicializará la escala a 20 en lugar del valor predeterminado de 0. Por ejemplo:

$ bc -l <<< '1.5 * 1.5'
2.25

$ bc -l <<< '1.52 * 1.52'
2.3104

Puede leer más sobre esto scaleen la bcpágina del manual .


55
O más corto: bc -l. " -L (La letra ell.) Defina las funciones matemáticas e inicialice la escala a 20, en lugar del cero predeterminado" - bcespecificación
manatwork

@manatwork: gracias, no noté ese cambio.
slm

Gracias. Supongo que podría establecer la escala en 2147483647 (que resulta ser igual a INT_MAX), que bc me dice que es el valor máximo de escala que puedo establecer (estoy muy lejos en mis pruebas), pero supongo que Solo lo probaré con números enteros y le dará a bc los beneficios de rendimiento que se obtienen al usar números de longitud dinámica.
PSkocik

1
Para la multiplicación de bc, la escala del resultado es exactamente min(max(sx,sy,scale),sx+sy)dónde sxy syson las escalas de xy yadentro x*y. La configuración scale=scale(x)+scale(y)le dará la máxima precisión necesaria. Establecer la escala a un número más alto (como un 1000) no aumentará la escala del resultado. La variable de escala solo afecta directamente a s, el resultado de la división scale=1000; a/1creará un resultado con 1000 dígitos decimales (después del punto) sin importar la escala de a antes.
Isaac

1

Prueba esto :

$ bc
scale=10
1.5 * 1.5
2.25

Buscar hombre de bc para variable de escala


0

He creado esta función bash que no mostrará ceros finales

calc () { MAX_PRECISION=20; bc <<< "scale=$MAX_PRECISION; scale = scale($@); $@"; }

Ejemplo: calc 1.25^3= 1.953125

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.