Как я могу облегчить переключение между арифметикой в ​​C ++? - PullRequest
1 голос
/ 07 февраля 2012

Я делаю проект, который будет часто использовать математические вычисления.Также я хочу иметь возможность просто изменить реализацию реальных чисел.Скажем, между float, double, моей собственной реализацией и типами gmplib float.

Итак, я могу выбрать один из двух способов:

  1. Я создаю класс "Number", который будет взаимодействовать с остальной частью программы.

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

Первый вариант выглядит более элегантным, но второй, похоже, имеет меньше накладных расходов.Есть ли третий лучший выбор?Также меня беспокоят элементарные математические функции, такие как sine, cosine, exp ... Я понял, что для облегчения переключения я должен реализовать их как шаблоны, но мои реализации безнадежно медленны.

Я вообще новичок в программировании на C ++.Я воспитывался в комфортной среде Matlab и Mathematica, где мне не приходилось беспокоиться о таких вещах.

Ответы [ 4 ]

3 голосов
/ 07 февраля 2012

Вы захотите использовать шаблоны с ограничениями, чтобы избежать повторной реализации.

Например, скажем, вы хотите использовать sin в своей программе по-разному для float и double.Вы можете перегружать на основе типа и создавать специализированные шаблоны.

template<class T> T MySin(const T& f) {
    return genericSin(f);
}

template<> float MySin<float>(float f) {
    return sinf(f);
}

template<> double MySin<double>(double d) {
    return sin(d);
}

Для функций.Синтаксис аналогичен при частичной специализации класса Math, если вы хотите пойти по пути OO.Это позволит вам вызывать ваши подпрограммы с любым типом и иметь наиболее специализированную и наиболее эффективную подпрограмму.

1 голос
/ 07 февраля 2012

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

для повышения эффективности используйте алгоритмы STL вместо рукописных циклов.

удачи

1 голос
/ 07 февраля 2012

Обе альтернативы эквивалентны с точки зрения инкапсуляции: в вашей программе будет одна точка, в которой вам придется изменить тип номера, и это одно изменение повлияет на всю вашу программу. Если представлены эти две альтернативы, выберите typedef; он менее изящен (=> проще, а проще - лучше) и обладает той же силой.

Когда вы освоитесь с C ++, лучше подойдет шаблонирование ваших функций, поскольку определение типа числа может быть выполнено локально, а не глобально. С помощью шаблонов вы определяете тип номера в точке создания экземпляра (скорее всего, на сайте вызова), что дает гораздо большую гибкость. Однако в шаблонах есть ряд подводных камней, и я бы порекомендовал вам сначала получить немного больше опыта с C ++, а затем начать создавать шаблоны.

1 голос
/ 07 февраля 2012

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

Тип числа может быть выполнен, но на самом деле это не просто сделать правильно и вводит некоторые ограничения (по сравнению с шаблонами).

Несколько типов просто безнадежно сложны, если вы хотите, чтобы что-то было даже близко к быстрому, точному и простому в обслуживании. Скорее всего, вам придется использовать шаблоны для их правильной реализации, если вы создадите глобальный typedef.

Шаблоны обеспечивают всю мощь, контроль и гибкость, которые вам понадобятся, и они будут быстрее, чем опубликованные альтернативы (технически, № 2 может быть быстрее, если вы прибегаете к ... шаблонам).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...