Comment puis-je arrêter bc à partir des lignes de séparation?
-
28-09-2019 - |
Question
J'utilise bc
à partir d'un script bash pour faire un peu rapide et sale maths BigInteger mais, quand je bosse l'échelle, il commence des lignes de séparation sur moi:
pax> echo 'scale=200 ; 1 / 4' | bc
.2500000000000000000000000000000000000000000000000000000000000000000\
00000000000000000000000000000000000000000000000000000000000000000000\
00000000000000000000000000000000000000000000000000000000000000000
pax> num="$(echo 'scale=200 ; 1 / 4' | bc )" ; echo $num
.2500000000000000000000000000000000000000000000000000000000000000000\ 00000 ...
Comment puis-je arrêter cela se passe pour que je peux obtenir le numéro sans grand écart? Les documents page de manuel ce comportement, mais ne semble pas donner toutes les options pour le changer.
En fait, je vais pas en arrière et vous dire la source de la demande au cas où quelqu'un a une meilleure solution. Je besoin d'un tableau de chaînes en C équivalentes aux valeurs 2 -n , le long des lignes de:
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)
};
Je me fiche de ce langage génère le tableau, je vais juste prendre la sortie et branchez-le dans mon code C. Je ne dois cependant la précision.
La solution
Au moins sur mon système, les commandes de variables d'environnement BC_LINE_LENGTH combien de temps les lignes de sortie sont:
$ echo 'scale=200; 1/4' | BC_LINE_LENGTH=9999 bc
.25000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Autres conseils
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))
Ce sont les valeurs brutes.
Si vous voulez créer syntaxe C, utiliser quelque chose comme ça.
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 "};"
Ce pourrait faire ce que vous voulez.
% echo 'scale=200; 1/4' | bc | tr -d '\n' | tr -d '\\'
.25000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000