eu faria
template<typename T>
T const pi = std::acos(-T(1));
ou
template<typename T>
T const pi = std::arg(-std::log(T(2)));
Eu não digitaria π com a precisão que você precisa . O que isso quer dizer? A precisão de que você precisa é a precisão T
, mas não sabemos nada sobreT
.
Você pode dizer: Do que você está falando? T
será float
, double
ou long double
. Então, basta digitar a precisão de long double
, ie
template<typename T>
T const pi = static_cast<T>(/* long double precision π */);
Mas você realmente sabe que no futuro não haverá um novo tipo de ponto flutuante com uma precisão ainda mais alta do que long double
? Você não
E é por isso que a primeira solução é linda. Você pode ter certeza de que o padrão sobrecarregaria as funções trigonométricas para um novo tipo.
E, por favor, não diga que a avaliação de uma função trigonométrica na inicialização é uma penalidade de desempenho.
3.14
,3.141592
eatan(1) * 4
?