0

したがって、dc は基数間の変換に最適なツールです。ちょっといじるコーディング作業に便利です。たとえば、1078 をバイナリに変換するには、次のようにします。

bash> echo "2o1078p" | dc
10000110110

ただし、0 と 1 の間の分数を正しく出力できません。0.3 をバイナリに変換しようとしています:

bash> echo "2o10k 0.3p" | dc
.0100

しかし、0.0100(bin) = 0.25 は 0.3 ではありません。

ただし、手動で値を作成すると、正しい答えが得られます

bash> echo "2o10k 3 10 / p" | dc
.0100110011001100110011001100110011

まあ、私が求める10の有効数字よりも多くを与えているように見えますが、それは問題ありません

私は何か間違ったことをしていますか?それとも、dc ができないことを dc にさせようとしているのですか?

bash> dc --version
dc (GNU bc 1.06) 1.3
...
4

2 に答える 2

1

dc は入力から有効数字を取得しているようです。

1/log10(2)=3.32これで、10 進数の各有効桁数は 2 進数で 3.3 桁になります。さまざまな入力 SF の長さに対する dc の出力を見ると、次のことがわかります。

`dc -e "2o10k 0.3 p"` => .0100
`dc -e "2o10k 0.30 p"` => .0100110
`dc -e "2o10k 0.300 p"` => .0100110011
`dc -e "2o10k 0.3000 p"` => .01001100110011

これらの値と期待値の表は次のceil(log10(2)*SFinput)とおりです。

input : output : expected output
1     : 4      : 4
2     : 7      : 7 
3     : 10     : 10 
4     : 14     : 14

そして、dc は期待どおりに動作しています。

したがって、解決策は、入力に適切な数の有効数字を使用するか、除算形式を使用することですdc -e "2o10k 3 10 / p"

于 2014-09-30T07:46:03.587 に答える
1

変。私が最初に考えたのは、おそらく精度は計算にのみ適用され、変換には適用されないのではないかということでした。ただし、除算のみで機能し、加算、減算、または乗算では機能しません。

エコー "2o10k 0.3 1/p" | 直流

.0100110011001100110011001100110011

echo "2o10k 0.3 0 + p" | 直流

.0100

echo "2o10k 0.3 0 - p" | 直流

.0100

echo "2o10k 0.3 1 * p" | 直流

.0100

精度については、man ページに「現在の入力基数または出力基数に関係なく、精度は常に 10 進数で測定される」と記載されています。これは、出力 (取得時) が 33 有効ビットである理由を説明しています。

于 2010-08-28T20:01:57.737 に答える