Константы с плавающей точкой в ​​шаблонном коде - PullRequest
8 голосов
/ 28 мая 2011

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

В одном месте моего кода я сравниваю значение с нулем (или с любым другим плавающим значением).постоянная точка).Должен ли я использовать 0.0 или 0.0f для сравнения?

template<T> void f(T a){
  //  should I use 0.0 or 0.0f in the following line?
  if(a == 0.0){
  }
}

Пока это не вызывает никаких проблем, я хотел бы знать, какова обычная практика.

Ответы [ 3 ]

13 голосов
/ 28 мая 2011

Я бы предложил

if (a == T(0)) ...
7 голосов
/ 28 мая 2011

Я бы предложил просто 0.В соответствии с правилами продвижения числовых типов, 0 будет повышен до типа операнда с плавающей запятой a.Продвижение константы - это преобразование во время компиляции, оно вообще не будет тормозить вашу программу.


С другой стороны, использование 0.0 заставит преобразование другого во время выполненияОперанд удваивается, что, вероятно, не является проблемой, так как операнд, скорее всего, в любом случае передается в регистр FPU.0.0f не приведет к преобразованию операндов с плавающей точкой, но если шаблон когда-либо использовался с целочисленным типом, вы получите преобразование во время выполнения в float.

1 голос
/ 28 мая 2011

Вы не должны сравнивать равенство по числу с плавающей запятой с простым

if (value == 0.0) // or 0.0f, doesn't matter

, поскольку в большинстве случаев оно не даст ожидаемого результата.Вы должны проверить, достаточно ли value близко к ожидаемому числу.То есть:

if (abs(value - 0.0) < epsilon) 

где epsilon - это что-то мало для вашей прикладной области.

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