2012-03-27 6 views
3

私は好奇心旺盛バグつまずいた、私は思う:BCと、それはIBASE/obaseでオプションです:

私はベース6と、ベース16として出力をする番号として「512」を読み取ろうとしました:

echo "ibase=6;obase=16;512" | bc 
161 

ご覧のとおり、出力は161ですが、bc(sic!)にする必要があります。私はベース10で試した:

echo "ibase=6;obase=10;512" | bc 
512 

値は変更されていません。興味深い!デフォルトのobaseは10です。省略した場合:

echo "ibase=6;512" | bc 
188 

これは正しいと思われます。 2つの段階のプロセスでは、それが動作:

echo "obase=16;"$(echo "ibase=6;512" | bc) | bc 
BC 

だから私は、別の拠点のためのスクリプトを作ったが、それは私が困惑し続ける:

for ib in {6,8,10,16}; do echo $ib; for ob in {10,16}; do echo -en $ib $ob"  \t => " ; echo "ibase=$ib;obase=$ob;333" | bc ; done; done; 
6 
6 10   => 333 
6 16   => 108 
8 
8 10   => 333 
8 16   => 119 
10 
10 10  => 333 
10 16  => 14D 
16 
16 10  => 333 
16 16  => 01 15 05 

私はバグレポートを提出しなければならない、または私は明白なことを欠場か?そのような基本的なツールが壊れているとは本当に信じられません。

答えて

21

ないバグ。

否やibase=6が解釈されるように、番号がそうがobaseでの値は無効であり、そして11 小数として解釈される16 ベース6ことを可能にするベース6に読み出されます。

マニュアルページから:

複数桁番号は、BCはIBASE-1の値にIBASEへのすべての入力桁以上変化します。

だから16 11 小数で15 ベース6と解釈されます。そして、変換は正しいです。

ibaseの前にobaseを設定するか、ibaseのベースにobaseを指定してください。

$ echo "obase=16;ibase=6;512" | bc 
BC 
3

あなたはibaseobaseを設定すると、それはibaseの現行ベースで表現していますhttp://docstore.mik.ua/orelly/unix/upt/ch49_03.htm

を参照してください。 obaseを10進数で表現する場合は、ibaseを設定する前にobaseに設定してください。

http://www.gnu.org/software/bc/manual/html_mono/bc.html#SEC9

入力数字が文字0-9と-Fを含むことが参照してください。 (注:大文字でなければなりません。小文字は変数名です。)ibaseの値にかかわらず、1桁の数字は常に桁の値を持ちます。 (つまりA = 10)複数桁の数値の場合、bcはibase以上のすべての入力桁をibase-1の値に変更します。これにより、数値FFFは常に入力桁の最大3桁の数字になります。

のでibase=6obase=16のために、このように、65となり、小数6 * 1 + 1 * 5 == 11の出力ベースに相当します。

$ echo "obase=11;ibase=6;512" | bc 
161 
関連する問題