2

我正在使用bcbash 脚本进行一些快速而肮脏的 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 代码中。但是,我确实需要准确性。

4

3 回答 3

2

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

$ echo 'scale=200; 1/4' | BC_LINE_LENGTH=9999 bc
.25000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
于 2010-11-26T03:15:35.377 回答
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 "};"

这可能会做你想要的。

于 2010-11-26T03:05:49.610 回答
0
% echo 'scale=200; 1/4' | bc | tr -d '\n' | tr -d '\\'
.25000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
于 2012-08-01T23:49:35.420 回答