2010-11-26 87 views
2

我使用bc從bash腳本做一些快速和骯髒的BigInteger數學,但是,當我碰到了規模,它開始對我分割線:如何阻止bc分割線?

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

那豈不是更簡單的,以避免在首先使用`bc`和`bash`地點?一個簡單的Python程序可能比這更容易。你爲什麼堅持`bc`? – 2010-11-26 03:04:11

回答

2

至少在我的系統中,BC_LINE_LENGTH環境變量控制輸出線有多長:

$ echo 'scale=200; 1/4' | BC_LINE_LENGTH=9999 bc 
.25000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 
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 "};" 

這可能會做你想做的。

+0

我需要這個去大約150個小數位(可能只有100個,但爲了安全起見) - 是Python的能力(特別是`1 /(2^256)= 8.6361685550944446253863518628004e-78`)? – paxdiablo 2010-11-26 03:09:03

+0

@paxdiablo:150個小數位?那麼你做錯了數學。做一些代數並擺脫分裂。 Python可以處理無限數量的數字。但是,根據分部操作員在事物的右端引入噪聲位。壞的,糟糕的設計。 – 2010-11-26 14:45:24

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