1

此处粘贴的代码

你好,所以。我刚刚写了我的第一个半重要的PC 程序,纯粹是为了好玩/为了解决问题而编写的,没有在编程课上分配问题。我敢肯定,你们中的许多人都记得你们为了好玩而编写的第一个重要程序。

我的问题是,我对代码的效率不满意。我不确定这是我的终端的 I/O 限制还是我的代码本身的限制,但对于 8 位或更高的 DAC 分辨率,它似乎运行得很慢。

我没有评论代码,所以这里是我试图用这个程序解决的问题的解释:

DAC 的输出电压由具有位 Bn、Bn-1 ... B0 的二进制数和满量程电压确定。

输出电压具有以下形式的方程:

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

您可以使用霍纳的方法来有效地评估公式。这是用来演示将二进制字符串转换为十进制的示例:

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”函数,您只需对每一位进行一次乘法(除法)。

顺便说一句,我看到您的代码允许高达 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返回一个不平衡的字符串(另一个)),这伤害了我的大脑

于 2011-02-22T11:52:47.007 回答