7

私は奇妙なバグに出くわしたと思います:

「512」を基数 6 の数値として読み取り、基数 16 として出力しようとしました。

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

バグレポートを提出する必要がありますか? そのような基本的なツールが壊れているとは本当に信じられません。

4

3 に答える 3

26

バグではありません。

が解釈されるとすぐにibase=6、数字は基数 6 で読み取られます。したがってibase=6;obase=16、 obase の値は無効な基数 6の 16になり、 11 decimalとして解釈されます。

マニュアルページから:

複数桁の数値の場合、bc は ibase 以上のすべての入力数字を ibase-1 の値に変更します。

したがって、16 は 15 を底とする 6として解釈され、11 は10 進数です。そして、変換は正しいです。

obaseの前に設定ibaseするか、base で obase を指定してくださいibase

$ echo "obase=16;ibase=6;512" | bc
BC
于 2012-03-27T13:08:26.337 に答える
5

http://docstore.mik.ua/orelly/unix/upt/ch49_03.htmを参照してください。

ibaseまたはを設定obaseすると、 の現在の基数で表されibaseます。したがって、10 進数で表現する場合は、設定obaseする前に設定してください。ibaseobase

http://www.gnu.org/software/bc/manual/html_mono/bc.html#SEC9も参照してください。

入力番号には、0 ~ 9 の文字と AF を含めることができます。(注: これらは大文字でなければなりません。小文字は変数名です。) 1 桁の数値は、ibase の値に関係なく、常にその桁の値を持ちます。(つまり、A = 10。)複数桁の数値の場合、bc は ibase 以上のすべての入力数字を ibase-1 の値に変更します。これにより、数値 FFF は常に入力基数の最大の 3 桁の数値になります。

したがって、obase=16inibase=6の場合、6は a5になり、これは decimal の出力基数と同等です6 * 1 + 1 * 5 == 11。したがって、次のようになります。

$ echo "obase=11;ibase=6;512" | bc
161
于 2012-03-27T13:07:37.997 に答える