如何阻止bc分裂线?

时间:2010-11-26 03:00:29

标签: biginteger bc

我正在使用bash脚本中的bc来做一些快速而又脏的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 个答案:

答案 0 :(得分:2)

至少在我的系统上,BC_LINE_LENGTH环境变量控制输出行的长度:

$ echo 'scale=200; 1/4' | BC_LINE_LENGTH=9999 bc
.25000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

答案 1 :(得分:1)

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

这可能会做你想要的。

答案 2 :(得分:0)

% echo 'scale=200; 1/4' | bc | tr -d '\n' | tr -d '\\'
.25000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000