я бы сделал
template<typename T>
T const pi = std::acos(-T(1));
или
template<typename T>
T const pi = std::arg(-std::log(T(2)));
Я бы не стал вводить π с той точностью, которая вам нужна . Что это вообще должно означать? Точность вам нужно это точностьT
, но мы ничего не знаем о T
.
Вы можете сказать: о чем ты говоришь? T
будет float
, double
или long double
. Итак, просто введите точность long double
, т.е.
template<typename T>
T const pi = static_cast<T>(/* long double precision π */);
Но знаете ли вы, что в будущем в стандарте не будет нового типа с плавающей запятой с еще большей точностью, чем long double
? Вы не
И именно поэтому первое решение красиво. Вы можете быть совершенно уверены, что стандарт перегружает тригонометрические функции для нового типа.
И, пожалуйста, не говорите, что оценка тригонометрической функции при инициализации является ухудшением производительности.
3.14
,3.141592
иatan(1) * 4
?