1

ここに貼り付けたコード

こんにちはSOです。プログラミングのクラスで問題を割り当てられていなかったので、純粋に楽しみ/問題を解決するために書かれた、最初の半重要なPC プログラムを書きました。皆さんの多くは、趣味で書いた最初の重要なプログラムを覚えていると思います。

私の問題は、コードの効率に満足していないことです。端末の I/O 制限によるものなのか、コード自体によるものなのかはわかりませんが、8 ビット以上の DAC 解像度ではかなり遅くなるようです。

コードにコメントしていないので、このプログラムで解決しようとしていた問題の説明を次に示します。

DAC の出力電圧は、ビット Bn、Bn-1 ... B0 を含む 2 進数とフルスケール電圧によって決まります。

出力電圧の式は次のようになります。

Vo = G( (1/(2^(0)))*(Bn) + (1/2^(0+1))*(Bn-1) + ... + (1/2^(0+n))*(B0) )

ここで、G は、すべてのビットの入力 B をフルスケール電圧にするゲインです。

コードを実行すると、アイデアは非常に明確になります。

私の問題は、コンソールに出力しているものは、108 行未満の C++ で実現できると思うことです。はい、ステップ電圧を事前に計算し、単純にテーブルをインクリメントしてレンダリングすることで簡単に実行できますが、このプログラムに対して私が持っている「自己要件」は、バイナリ表現された入力ごとに上記の一連の計算を実行することです。 .

私はその要件に夢中になるつもりはありません。このプログラムで、現在実行している式の性質を証明してもらいたいと思います。私が探しているのは、私の実装を一般的によりクリーンで効率的にする方法に関するいくつかの提案です。

4

2 に答える 2

1

ホーナーの方法を使用して、式を効率的に評価できます。バイナリ文字列を 10 進数に変換するために使用する例を次に示します。

0.1101 = (1*2 -1 + 1*2 -2 + 0*2 -3 + 1*2 -4 )。

この式を効率的に評価するには、項を右から左に書き直してから、次のようにネストして評価します。

(((1 * 2 -1 + 0) * 2 -1 + 1) * 2 -1 + 1) * 2 -1 = 0.8125.

このようにして、「pow」関数を削除し、ビットごとに 1 つの乗算 (除算) を実行するだけで済みます。

ところで、あなたのコードでは最大 128 ビットの精度が許可されているようです。double で正確に計算することはできません。

于 2011-02-22T14:28:04.000 に答える
1

pow(2.0, x)ほとんどの場合、悪い考えです - 特に x を繰り返し処理している場合。pow(2.0,0) == 1、 とpow(2.0,x) == 2 * pow(2.0,x-1)

DtoAeqnバランスの取れていない文字列 (もう 1 つ)) を返します。これは私の脳を傷つけます

于 2011-02-22T11:52:47.007 に答える