yo lo haría
template<typename T>
T const pi = std::acos(-T(1));
o
template<typename T>
T const pi = std::arg(-std::log(T(2)));
Yo no escribir en π a la precisión que necesita . ¿Qué se supone que significa eso? La precisión que necesita es la precisión de T
, pero no sabemos nada al respecto T
.
Podrías decir: ¿De qué estás hablando? T
será float
, double
o long double
. Entonces, solo escriba la precisión de long double
, es decir
template<typename T>
T const pi = static_cast<T>(/* long double precision π */);
Pero, ¿sabe realmente que no habrá un nuevo tipo de coma flotante en el estándar en el futuro con una precisión aún mayor que long double
? Usted no
Y es por eso que la primera solución es hermosa. Puede estar bastante seguro de que el estándar sobrecargaría las funciones trigonométricas para un nuevo tipo.
Y, por favor, no diga que la evaluación de una función trigonométrica en la inicialización es una penalización de rendimiento.
3.14
,3.141592
yatan(1) * 4
?