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ò.

È stato utile?

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top