Come faccio a smettere bc dalle linee di scissione?
-
28-09-2019 - |
Domanda
sto usando bc
da uno script bash per fare qualche rapido e sporco BigInteger la matematica, ma, quando mi imbatto in alto nella scala, inizia linee suddivisione su di me:
pax> echo 'scale=200 ; 1 / 4' | bc
.2500000000000000000000000000000000000000000000000000000000000000000\
00000000000000000000000000000000000000000000000000000000000000000000\
00000000000000000000000000000000000000000000000000000000000000000
pax> num="$(echo 'scale=200 ; 1 / 4' | bc )" ; echo $num
.2500000000000000000000000000000000000000000000000000000000000000000\ 00000 ...
Come faccio a evitare che questo succeda in modo che io posso solo ottenere il numero senza spaccature? La pagina man documenti questo comportamento, ma non sembra dare le opzioni per la modifica di esso.
In realtà, io passo indietro e ti dirà la fonte della richiesta nel caso qualcuno ha una soluzione migliore. Ho bisogno di un array di stringhe in C equivalenti ai valori 2 -n , lungo le linee di:
static char *str[] = {
"1.00000000 ... 000", // 1/1 to 150 fractional places.
"0.50000000 ... 000", // 1/2
"0.25000000 ... 000", // 1/4
"0.12500000 ... 000", // 1/8
: : :
"0.00000000 ... 004", // 1/(2^256)
};
Non mi importa che lingua genera l'array, sto solo andando a prendere l'uscita e inserirlo nel mio codice C. Ho bisogno la precisione però.
Soluzione
Almeno sul mio sistema, i controlli delle variabili di ambiente BC_LINE_LENGTH per quanto tempo le linee di uscita sono:
$ echo 'scale=200; 1/4' | BC_LINE_LENGTH=9999 bc
.25000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Altri suggerimenti
localhost:~ slott$ python -c 'print "{0:.200f}".format( 1./4. )'
0.25000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
localhost:~ slott$ python -c 'import decimal; print 1/decimal.Decimal( 2**256 )'
8.636168555094444625386351863E-78
import decimal
for i in range(256):
print "{0:.150f}".format(1/decimal.Decimal(2**i))
Ecco i valori grezzi.
Se si desidera creare sintassi corretta C, uso qualcosa di simile.
def long_string_iter():
for i in range(256):
yield i, "{0:.150f}".format(1/decimal.Decimal(2**i))
def c_syntax( string_iter ):
print "static char *str[] = {"
for i, value in string_iter():
print ' "{0}", // 1/{1}'.format( value, i )
print "};"
che potrebbe fare quello che vuoi.
% echo 'scale=200; 1/4' | bc | tr -d '\n' | tr -d '\\'
.25000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000