Мой код работает, но я не удовлетворен эффективностью. (От C ++ int до двоичного к масштабированному double) - PullRequest
1 голос
/ 22 февраля 2011

Код, вставленный здесь

Привет ТАК. Я только что написал свою первую полусущественную программу для ПК, написанную исключительно для удовольствия / для решения проблемы, не имея задачи в классе программирования. Я уверен, что многие из вас помнят первую значительную программу, которую вы написали для развлечения.

Моя проблема в том, что я не удовлетворен эффективностью моего кода. Я не уверен, является ли это ограничением ввода / вывода моего терминала или самого моего кода, но, похоже, он работает довольно медленно для разрешений ЦАП 8 бит или выше.

Я не прокомментировал код, поэтому вот объяснение проблемы, которую я пытался решить с помощью этой программы:

Выходное напряжение ЦАП определяется двоичным числом, имеющим биты Bn, Bn-1 ... B0 и натурное напряжение.

Выходное напряжение имеет уравнение вида:

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

Где G - это коэффициент усиления, при котором на входе всех битов устанавливается высокое значение напряжения полной шкалы.

Если вы запустите код, идея будет вполне понятна.

Моя проблема в том, что я думаю, что то, что я вывожу на консоль, может быть достигнуто гораздо менее чем в 108 строках C ++. Да, это легко сделать, предварительно рассчитав шаговое напряжение и просто отобразив таблицу с помощью приращения, но «самообеспечение», которое я имею для этой программы, заключается в том, что на некотором уровне она выполняет вычисление последовательностей, описанное выше для каждого представленного двоичного входного сигнала. .

Я не пытаюсь сойти с ума с этим требованием. Я хотел бы, чтобы эта программа доказала природу формулы, которую она в настоящее время делает. Что я ищу, так это несколько советов о том, как сделать мою реализацию в целом более чистой и эффективной.

Ответы [ 2 ]

1 голос
/ 22 февраля 2011

Вы можете использовать метод Хорнера для эффективной оценки формулы. Вот пример , который я использую , чтобы продемонстрировать его для преобразования двоичных строк в десятичную:

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 бит. Вы не сможете рассчитать это точно в два раза.

1 голос
/ 22 февраля 2011

pow(2.0, x) почти всегда плохая идея, особенно если вы перебираете x.pow(2.0,0) == 1 и pow(2.0,x) == 2 * pow(2.0,x-1)

DtoAeqn возвращает несбалансированную строку (еще одну )), которая причиняет боль моему мозгу .

...