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 ...

分割せずに番号を取得できるように、これを防ぐにはどうすればよいですか? man ページにはこの動作が記載されていますが、変更するためのオプションは提供されていないようです。


実際には、誰かがより良い解決策を持っている場合に備えて、一歩下がってリクエストのソースをお伝えします. 次の行に沿って、値 2 -nに相当する C の文字列の配列が必要です。

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 に答える