【问题标题】:My code works, but I'm not satisfied with the efficiency. (C++ int to binary to scaled double)我的代码有效,但我对效率不满意。 (C++ int to binary to scaled double)
【发布时间】:2011-02-22 11:44:11
【问题描述】:

Code pasted here

你好。我刚刚编写了我的第一个半显着 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++ 来实现。是的,它可以通过预先计算步进电压并简单地通过增量来渲染表格来轻松完成,但是我对这个程序的“自我要求”是,在某种程度上,它为每个二进制表示的输入执行上述系列计算.

我并不想对这个要求发疯。我希望这个程序能够证明它目前所做的公式的性质。我正在寻找的是关于如何使我的实现总体上更清洁、更高效的一些建议。

【问题讨论】:

  • +1 是我多年来见过的最干净的初学者代码。恭喜!

标签: c++ binary dac


【解决方案1】:

pow(2.0, x) 几乎总是一个坏主意——尤其是当你迭代 x 时。 pow(2.0,0) == 1pow(2.0,x) == 2 * pow(2.0,x-1)

DtoAeqn 返回一个不平衡的字符串(又一个)),即hurts my brain

【讨论】:

  • 我刚刚注意到不平衡的字符串,这很令人不安,因为我曾经将那部分内联。
【解决方案2】:

您可以使用Horner's method 有效地评估公式。这是一个example I use 来演示将二进制字符串转换为十进制:

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 中准确计算。

【讨论】:

    猜你喜欢
    • 2014-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-19
    • 1970-01-01
    • 2016-06-19
    • 1970-01-01
    相关资源
    最近更新 更多