Я бы сделал
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
? Вы не.
И вот почему первое решение прекрасно. Вы можете быть совершенно уверены, что стандарт перегружает тригонометрические функции для нового типа.
И, пожалуйста, не говорите, что оценка тригонометрической функции при инициализации является ухудшением производительности.