У меня есть следующий фрагмент кода:
#include <cmath>
float foo(float x, unsigned int m, float q = 0.0f)
{
return std::floorf(x * float(m) + q);
}
Теперь, когда я пытаюсь скомпилировать это с g ++ 5.4.0 и параметрами -std=c++11
, я получаю сообщение об ошибке ‘floorf’ is not a member of ‘std’
.
Теперь я понимаю, что пункт 26.8 стандарта C ++ 11 требует, чтобы стандартный заголовок библиотеки C ++ <cmath>
объявлял тот же набор функций, что и стандартный заголовок библиотеки C <math.h>
, хотя и в пространстве имен std
;и этот пункт 1.2 указывает, что «C» следует интерпретировать как C99;и этот пункт 7.12.9.2 стандарта C99 требует, чтобы стандартный заголовок библиотеки C <math.h>
объявлял функцию float floorf(float)
.
Таким образом, по этой причине <cmath>
должен объявить функцию float std::floorf(float)
, котораяНасколько я знаю, это должно соответствовать моему коду.
Что дает?Я что-то здесь упускаю?
(я знаю, что C ++ 11 также определяет float std::floor(float)
; однако недавно я обнаружил, что f
-сфиксированные вариантыФункции с плавающей точкой обычно немного быстрее, поэтому я бы предпочел специально вызывать floorf()
.)