我正在使用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代码中。但我确实需要准确性。
答案 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