tôi sẽ làm
template<typename T>
T const pi = std::acos(-T(1));
hoặc là
template<typename T>
T const pi = std::arg(-std::log(T(2)));
Tôi sẽ không gõ vào số chính xác mà bạn cần . Điều đó thậm chí có nghĩa là gì? Độ chính xác bạn cần là độ chính xác T
, nhưng chúng tôi không biết gì vềT
.
Bạn có thể nói: Bạn đang nói về cái gì? T
sẽ float
, double
hoặc long double
. Vì vậy, chỉ cần gõ vào độ chính xác của long double
, tức là
template<typename T>
T const pi = static_cast<T>(/* long double precision π */);
Nhưng bạn có thực sự biết rằng sẽ không có loại điểm nổi mới trong tiêu chuẩn trong tương lai với độ chính xác thậm chí còn cao hơn long double
không? Bạn không.
Và đó là lý do tại sao giải pháp đầu tiên là đẹp. Bạn có thể khá chắc chắn rằng tiêu chuẩn sẽ quá tải các hàm lượng giác cho một loại mới.
Và xin vui lòng, đừng nói rằng việc đánh giá hàm lượng giác khi khởi tạo là một hình phạt hiệu suất.
3.14
,3.141592
vàatan(1) * 4
?