2012-02-12 5 views
2

Я разрабатываю многоцелевую математическую библиотеку C++, которая будет использоваться для создания интерфейсов, игр и т. Д. К сожалению, я придерживаюсь дизайнерской дилеммы и нуждаюсь в некоторых мнениях. Математическая библиотека содержит обычные классы Vector, Math, Matrix, но я не могу решить, использовать ли float или double.Урегулирование по типу данных

Может ли кто-нибудь перечислить несколько недостатков, пройдя все поплавки или все двойные. Действительно ли мир собирается использовать все парные, и должен ли я даже поплавать?

Имея это в виду, есть ли какие-либо архитектурные преимущества, на которые я должен смотреть, например, использовать удвоения, лучше использовать на 64-битных системах, будет лучше плавать для 32-битных систем (а что с операциями SIMD?)

Каким будет идеальный способ проектирования такой системы?

+4

Простой: используйте шаблоны. Таким образом, вы можете позволить обоим. –

ответ

1

У вас есть 2 варианта:

  1. Использование шаблонов
  2. Используйте ЬурейеЕ

Они позволяют изменить тип. Возможность использования обоих типов лучше, чем использование только одного.

+0

Это были мои два подхода в прошлом (шаблоны для более общих, библиотечных материалов, typedefs для классов приложений). Моя самая большая проблема - найти хорошее имя для типа typedef. – aib

+0

@aib: 'T' и 'value_type' являются общими. –

+0

'typedef float T;'? На, я думаю, я бы назвал его 'float_t' и поместил typedef в файл' common.h' или 'application.h'. – aib

1

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

Обратите внимание, что игровые движки почти универсально используют float. В то время как процессоры, как правило, работают с высокой точностью по умолчанию, графические процессоры работают с указанной вами точностью и намного быстрее работают с float, чем с double; аналогично для наборов инструкций SIMD. Также обратите внимание, что OpenGL ES 1.1 и 2.0 даже не поддерживают double.

0

В компиляторах Microsoft, которые я использую, нет математической библиотеки с плавающей точкой. Если вы передадите поплавок в математическую функцию, его удваивают. Затем вы должны вернуть результат обратно в float. Таким образом, вы могли бы пойти с двойным везде. (Если вы находитесь в этой среде).

[EDIT] Конечно, если у вас есть массив из 10 000 значений с плавающей запятой, то использование float позволит сэкономить значительное количество памяти.

+0

У вас должен быть странный SKU. Моя копия Visual Studio имеет всю гамму 'sinf',' tanf', 'atan2f' и т. Д.Он также имеет встроенные функции SIMD, которые явно вычисляют с использованием указанной точности. –

+0

@MarceloCantos: Я думаю, что некоторые из функций библиотеки математики C++ не имеют перегрузок float. Вы указали функции библиотеки C math. –

+0

@MooingDuck: Каждый, на который я смотрел (fmod, sin, cos, asin, tan, atan, atan2, log, log10, exp) имеет перегрузки C++ для float. О каких из них вы думаете? –

0

Поплавки меньше (= быстрее для чтения/записи из памяти и для передачи из/в графику casrd), быстрее для определенных операций (делений и квадратных корней), 4 поплавки хорошо вписываются в один регистр SIMD (однородные координаты) , и иметь адекватную точность для игр. Между 32 и 64-битными системами нет разницы в скорости между float/double.

В заключение: палка с поплавками. Возможно, вы захотите использовать typedef, например typedef float CoordinateType.

Смежные вопросы