C ++ 11, 14, 17 또는 20은 파이에 대한 표준 상수를 도입합니까? 알고 M_PI에 정의 된 math.h표준에 의해

C와 C ++의 숫자 pi에는 다소 어리석은 문제가 있습니다. 멀리로 나는 알고 M_PI에 정의 된 math.h표준에 의해 필요하지 않습니다.

새로운 C ++ 표준은 표준 라이브러리에서 쌍곡선 함수 std::hermitestd::cyl_bessel_i다른 난수 생성기 등 의 복잡한 수학을 많이 도입했습니다 .

‘새로운’표준 중 어떤 것이 파이에 대한 상수를 가져 왔습니까? 그렇지 않은 경우-왜? 이 복잡한 수학은 모두없이 어떻게 작동합니까?

C ++에서 pi에 대한 비슷한 질문을 알고 있습니다 (몇 년이고 표준이 오래되었습니다). 문제의 현재 상태를 알고 싶습니다.

C ++에 여전히 pi 상수가 없지만 더 복잡한 수학이 필요한지에 관심이 있습니다.

UPD : pi를 4 * atan (1) 또는 acos (1) 또는 double pi = 3.14로 정의 할 수 있다는 것을 알고 있습니다. 확실한. 그러나 2018 년에 왜 여전히해야합니까? 표준 수학 함수는 pi없이 어떻게 작동합니까?

UPD2 : 쾰른에서 2019 년 7 월 C ++위원회 회의에 대한 여행 보고서에 따르면 제안 P0631 (수 상수)이 C ++ 20으로 수락되었습니다. 결국에는 표준 라이브러리에 숫자 pi가있는 것처럼 보입니다!



답변

C ++ 17까지 pi 는 언어에 지속적으로 도입되지 않으며 목에 통증이 있습니다.

나는 부스트를 사용한다는 점에서 운이 좋으며 128 비트조차도 충분히 많은 소수 자릿수로 pi 를 정의 long double합니다.

Boost를 사용하지 않으면 직접 하드 코딩하십시오. 삼각 함수로 정의하는 것은 유혹적이지만 그렇게하면 그것을 만들 수 없습니다 constexpr. 삼각 함수의 정확도는 (의 표준 I의 노하우에 의해 보장되지 CF . std::sqrt그래서 정말 당신이 실제로 이러한 기능에 의존하는 위험한 지상에 있습니다).

메타 프로그래밍을 사용하여 piconstexpr가치를 얻는 방법이 있습니다 : http://timmurphy.org/2013/06/27/template-metaprogramming-in-c/


C ++ 20에서 좋은 소식이 있습니다. 가 이다 의 defininition 파이는 . C ++ 20은에 수학 상수를 추가합니다 <numbers>. 예를 들어 std::numbers::piA는 double유형입니다.

참조 : https://en.cppreference.com/w/cpp/numeric/constants


답변

다른 사람들이 말했듯이 std::pi정확한 PI가치를 원한다면 다음을 사용할 수 있습니다.

constexpr double pi = std::acos(-1);

이것은 C ++ 구현이에서 올림 된 올바른 PI 값을 생성한다고 가정 하는데acos(-1.0) , 일반적이지만 보장되지는 않습니다 .

아니야 constexpr 아니지만 실제로 gcc 및 clang과 같은 최적화 컴파일러는 컴파일 타임에 그것을 평가합니다. const그래도 옵티마이 저가 좋은 일을 하는 것이 중요하다고 선언합니다 .


답변

C ++ 20까지는 아니오, 숫자 pi (π)를 나타내는 상수를 소개하는 표준이 없습니다 . 코드에서 숫자를 근사 할 수 있습니다.

constexpr double pi = 3.14159265358979323846;

같은 C # 등의 다른 언어 상수가 자신의 라이브러리에 선언했다.

업데이트 :
C ++ 20부터 헤더 pi안에 상수가 선언되었습니다 <numbers>. 다음을 통해 액세스합니다 : std::numbers::pi.


답변

M_PI언어 표준이 아닌 경우 “표준”으로 정의됩니다 . POSIX . X / Open System Interfaces 확장을 사용하는 (공식 UNIX 브랜딩에 매우 일반적으로 지원되고 필요함).

C ++ 20에 무엇이 있는지 확신 할 수는 없지만 요청한 후에 아마도 상수 가있을 것입니다 . 이 논문은 2019 년 8 월위원회 초안을 위해 C ++ 20 기능의 마지막 라운드에 병합되었습니다.

특히 std::numbers::pi(유형 double)과 다른 부동 소수점 유형을 원할 경우 사용할 수있는 변수 템플릿이 있습니다 (예 🙂 std::numbers::pi_v<float>. 상수의 전체 목록은 [numbers.syn] 에서 볼 수 있습니다 .


답변

도메인 전체에 적용 할 수있는 pi를 정의하는 명백한 유형이 없기 때문에 분명히 좋은 생각은 아닙니다.

파이는 올바르게으로 표현 될 수없는 물론, 무리수, 그래서이다 어떤 C ++ 유형입니다. 따라서 자연스러운 접근 방식은 사용 가능한 가장 큰 부동 소수점 유형으로 정의하는 것입니다. 그러나 가장 큰 표준 부동 소수점 유형의 크기long double 는 C ++ 표준에 의해 정의되지 않으므로 상수 값은 시스템마다 다릅니다. 더 나쁜 것은, 워킹 타입이이 가장 큰 타입이 아닌 프로그램의 경우, pi의 정의는 pi를 사용할 때마다 성능 비용을 부과하기 때문에 부적절한 것입니다.

또한 모든 프로그래머가 pi의 값을 찾고 사용하기에 적합한 상수를 정의하는 것은 사소한 일이므로 수학 헤더에 포함시키는 데 큰 이점을 제공하지 않습니다.


답변

수정 됨-논란의 여지가 있었으므로 필요한 용어를 제거합니다. 절대 용어가 너무 많습니다.

C ++은 크고 복잡한 언어이므로 표준위원회에는 강력하게 요구 되는 사항 만 포함됩니다 . 부스트와 같은 언어 이외의 표준 라이브러리에는 가능한 한 많이 있습니다.
부스트 :: 수학 :: 상수