BC: moltiplicazione automatica della massima precisione


10

In alto, ho bisogno di testare il mio calcolatore di precisione arbitrario e mi bcsembra un buon metro da confrontare, tuttavia, bctronca il risultato di ogni moltiplicazione a quella che sembra essere la scala massima degli operandi coinvolti ciascuno.

Esiste un modo rapido per disattivarlo o impostare automaticamente la scala di ciascuna moltiplicazione sulla somma delle scale dei fattori in modo che non perda alcuna precisione?

Se hai una soluzione più elegante a questo riguardo a qualcosa di diverso bc, apprezzerei la tua condivisione.

Esempio:

$ bc <<< '1.5 * 1.5'
2.2

La vera risposta è 2,25.


Strettamente correlato all'operazione Float con bc? .
arte

Risposte:


12

È possibile controllare la scala che bcgenera l' scale=<#>argomento.

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

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

Usando il tuo esempio:

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

Puoi anche usare l' -linterruttore (grazie a @manatwork) che inizializzerà la scala a 20 anziché il valore predefinito di 0. Ad esempio:

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

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

Puoi leggere di più scalenella bcpagina man .


5
O più breve: bc -l. “ -L (The letter ell.) Definisce le funzioni matematiche e inizializza la scala su 20, anziché lo zero predefinito” - bcspecifica
manatwork

@manatwork - grazie, non ho notato questo passaggio.
slm

Grazie. Immagino di poter impostare la scala su 2147483647 (che risulta essere uguale a INT_MAX), che bc mi dice che è il valore di scala massimo che posso impostare (sono troppo avanti nei miei test), ma immagino che lo testerò solo con numeri interi e forniremo a bc i vantaggi in termini di prestazioni derivanti dall'utilizzo di numeri a lunghezza dinamica.
PSkocik,

1
Per la moltiplicazione bc, la scala del risultato è esattamente min(max(sx,sy,scale),sx+sy)dove sxe sysono le scale di xe yin x*y. L'impostazione scale=scale(x)+scale(y)fornirà la massima precisione necessaria. L'impostazione della scala su un numero più alto (come un 1000) non aumenterà la scala del risultato. La variabile di scala influenza solo s direttamente il risultato della divisione scale=1000; a/1creerà un risultato con 1000 cifre decimali (dopo il punto) indipendentemente da quale fosse la scala di a prima.
Isacco,

1

Prova questo :

$ bc
scale=10
1.5 * 1.5
2.25

Cerca l'uomo di bc per la variabile di scala


0

Ho creato questa funzione bash che non mostrerà zero finali

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

Esempio: calc 1.25^3= 1.953125

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.