c++ - std:: iterator_traits




C++ 11, 14, 17 ou 20 introduz uma constante padrão para pi? (4)

Há um problema bastante bobo com o número pi em C e C ++. Tanto quanto sei, M_PI definido em math.h não é exigido por nenhum padrão.

Os novos padrões C ++ introduziram muita matemática complicada na biblioteca padrão - funções hiperbólicas, std::hermite e std::cyl_bessel_i , diferentes geradores de números aleatórios e assim por diante.

Algum dos "novos" padrões trouxe uma constante para pi? Se não - por quê? Como toda essa matemática complicada funciona sem ela?

Estou ciente de questões semelhantes sobre pi em C ++ (são vários anos e padrões antigos); Eu gostaria de saber o estado atual do problema.

Também estou muito interessado em saber por que, por que o C ++ ainda não tem uma constante pi mas tem muita matemática mais complicada.

UPD: Eu sei que eu posso definir pi como 4 * atan (1) ou acos (1) ou pi duplo = 3.14. Certo. Mas por que em 2018 ainda tenho que fazer isso? Como funcionam as funções matemáticas padrão sem pi?

UPD2: De acordo com este relatório de viagem para a reunião do Comitê C ++ em julho de 2019 em Colônia, a proposta P0631 (constantes matemáticas) foi aceita em C ++ 20. Então parece que finalmente teremos o número pi na biblioteca padrão!


Como outros disseram, não há std::pi mas se você quiser um valor preciso de PI você pode usar:

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

Isso pressupõe que sua implementação C ++ produz um valor arredondado corretamente do PI de acos(-1.0) , que é comum, mas não garantido .

Não é constexpr , mas na prática otimizar compiladores como gcc e clang avaliá-lo em tempo de compilação. Declarar const é importante para o otimizador fazer um bom trabalho.


Editado - Para remover o prazo necessário, porque se revelou controverso. É muito de um termo absoluto.

C ++ é uma linguagem grande e complexa, por isso o Comitê de Padrões inclui apenas coisas que são fortemente requeridas . O máximo possível é deixado para bibliotecas padrão não linguísticas ... como o Boost.
boost::math::constants


Não, pi ainda não é uma constante introduzida na língua, e é uma dor no pescoço.

Eu tenho sorte em usar o Boost (www.boost.org) e eles definem pi com um número suficientemente grande de casas decimais para um long double 128 bits.

Se você não usar o Boost, codifique-o por conta própria. Defini-lo com uma função trigonométrica é tentador, mas se você fizer isso, você não poderá torná-lo um constexpr . A precisão das funções trigonométricas também não é garantida por nenhum padrão que conheço ( cf. std::sqrt ), então você realmente está em terreno perigoso, na verdade confiando em tal função.

Existe uma maneira de obter um valor constexpr para pi usando metaprogramação: consulte http://timmurphy.org/2013/06/27/template-metaprogramming-in-c/


Não, nenhum dos padrões introduz a constante que representaria o número pi (π). Você pode aproximar o número em seu código:

constexpr double pi = 3.14159265358979323846;

Outras linguagens, como C #, have a constante declarada em suas bibliotecas. C ++ não.







c++17