Как мне остановить bc от расщепления линий? - PullRequest
2 голосов
/ 26 ноября 2010

Я использую bc из скрипта bash, чтобы выполнить быструю и грязную математику BigInteger, но когда я увеличиваю масштаб, он начинает разбивать мне строки:

pax> echo 'scale=200 ; 1 / 4' | bc
.2500000000000000000000000000000000000000000000000000000000000000000\
00000000000000000000000000000000000000000000000000000000000000000000\
00000000000000000000000000000000000000000000000000000000000000000

pax> num="$(echo 'scale=200 ; 1 / 4' | bc )" ; echo $num
.2500000000000000000000000000000000000000000000000000000000000000000\ 00000 ...

Как мнеостановить это, чтобы я мог получить номер без каких-либо расколов?Страница руководства документирует это поведение, но, похоже, не дает никаких вариантов для его изменения.


На самом деле, я сделаю шаг назад и сообщу вам источник запроса, если у кого-то есть лучшее решение.,Мне нужен массив строк в C, эквивалентный значениям 2 -n , в соответствии с:

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)
};

Мне все равно, какой язык генерирует массив, япросто собираюсь взять вывод и подключить его к моему C-коду.Однако мне нужна точность.

Ответы [ 3 ]

2 голосов
/ 26 ноября 2010

По крайней мере, в моей системе переменная окружения BC_LINE_LENGTH контролирует длину выходных строк:

$ echo 'scale=200; 1/4' | BC_LINE_LENGTH=9999 bc
.25000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
1 голос
/ 26 ноября 2010
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))

Это необработанные значения.

Если вы хотите создать правильный синтаксис C, используйте что-то вроде этого.

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 "};"

Это может сделать чтоты хочешь.

0 голосов
/ 02 августа 2012
% echo 'scale=200; 1/4' | bc | tr -d '\n' | tr -d '\\'
.25000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
...