Saya akan lakukan
template<typename T>
T const pi = std::acos(-T(1));
atau
template<typename T>
T const pi = std::arg(-std::log(T(2)));
Saya tidak akan mengetikkan π dengan presisi yang Anda butuhkan . Apa artinya itu? The presisi yang Anda butuhkan adalah ketepatan T
, tapi kita tahu apa-apa tentangT
.
Anda mungkin berkata: Apa yang sedang Anda bicarakan? T
akan float
, double
atau long double
. Jadi, ketikkan saja ketepatannya long double
, yaitu
template<typename T>
T const pi = static_cast<T>(/* long double precision π */);
Tapi apakah Anda benar-benar tahu bahwa tidak akan ada tipe floating point baru dalam standar di masa depan dengan presisi yang lebih tinggi daripada long double
? Kamu tidak.
Dan itulah mengapa solusi pertama itu indah. Anda dapat yakin bahwa standar akan membebani fungsi trigonometri untuk tipe baru.
Dan tolong, jangan katakan bahwa evaluasi fungsi trigonometri pada inisialisasi adalah penalti kinerja.
3.14
,3.141592
danatan(1) * 4
?