Имеет ли С++ 11, 14, 17 или 20 стандартную константу для pi?
Существует довольно глупая проблема с числом pi в C и C++. Насколько я знаю, M_PI
, определенный в math.h
, не требуется ни в одном стандарте.
Новые стандарты C++ ввели много сложной математики в стандартную библиотеку - гиперболические функции, std::hermite
и std::cyl_bessel_i
, различные генераторы случайных чисел и т.д. И т.д.
Приносил ли какой-нибудь "новый" стандарт константу для пи? Если нет - почему? Как все это сложная математика работает без нее?
Мне известны подобные вопросы о пи в C++ (им несколько лет и по стандартам); Я хотел бы знать текущее состояние проблемы.
Меня также очень интересует, почему C++ до сих пор не имеет константы пи, но имеет много более сложной математики.
UPD: я знаю, что могу сам определить pi как 4 * atan (1) или acos (1) или double pi = 3.14. Конечно. Но почему в 2018 году я все еще должен это сделать? Как стандартные математические функции работают без пи?
UPD2: Согласно этому отчету о поездке на C++ заседание Комитета в июле 2019 года в Кельне, предложение P0631 (математические константы) было принято в C++ 20. Похоже, наконец-то у нас в стандартной библиотеке будет число pi!
Ответы
Ответ 1
Нет, пи по-прежнему не является константой, введенной в язык, и это боль в шее.
Мне повезло, что я использую Boost (www.boost.org), и они определяют число pi с достаточно большим количеством десятичных разрядов даже для 128-битного long double
.
Если вы не используете Boost, то сделайте это самостоятельно. Определение его с помощью тригонометрической функции заманчиво, но если вы сделаете это, вы не сможете сделать это constexpr
. Точность тригонометрических функций также не гарантируется ни одним из известных мне стандартов (см. std::sqrt
), так что в действительности вы находитесь в опасной ситуации, действительно полагаясь на такую функцию.
Есть способ получить значение constexpr
для числа пи с помощью метапрограммирования: см. http://timmurphy.org/2013/06/27/template-metaprogramming-in-c/
Ответ 2
Нет, ни один из стандартов не вводит константу, которая будет представлять число pi (π). Вы можете приблизиться к числу в вашем коде:
constexpr double pi = 3.14159265358979323846;
Другие языки, такие как С#, имеют константу, объявленную в своих библиотеках. C++ нет.
Ответ 3
Как говорили другие, нет std::pi
но если вы хотите точное значение PI
вы можете использовать:
constexpr double pi = std::acos(-1);
Это предполагает, что ваша реализация C++ дает правильно округленное значение PI от acos(-1.0)
, что является общим, но не гарантированным.
Это не constexpr
, но на практике оптимизация компиляторов, таких как gcc и clang, оценивает его во время компиляции. Объявление const
важно для оптимизатора, чтобы сделать хорошую работу.
Ответ 4
M_PI
определяется "стандартом", если не стандартом языка: POSIX с расширением X/Open System Interfaces (которое очень часто поддерживается и требуется для официальной маркировки UNIX).
Он (все еще) не уверен, что будет в С++ 20, но так как вы спросили: у него, вероятно, будут такие константы. Документ был объединен в последнем раунде функций С++ 20 (для проекта комитета в августе 2019 года).
В частности, будет std::numbers::pi
(типа double
) и шаблон переменной, который вы можете использовать, если вам нужен другой тип с плавающей запятой, например, std::numbers::pi_v<float>
. Полный список констант можно увидеть в [numbers.syn].
Ответ 5
Это не очень хорошая идея, потому что нет очевидного типа, с помощью которого можно определить pi, который универсален для всех доменов.
Pi, конечно, является иррациональным числом, поэтому он не может быть правильно представлен каким-либо типом C++. Вы можете утверждать, что естественный подход состоит в том, чтобы определить его в самом большом доступном типе с плавающей точкой. Однако размер long double
типа с плавающей запятой не определяется стандартом C++, поэтому значение константы будет различаться между системами. Хуже того, для любой программы, в которой рабочий тип не был самым большим типом, определение pi было бы неуместным, поскольку оно налагало бы стоимость исполнения при каждом использовании pi.
Для любого программиста также тривиально найти значение pi и определить собственную константу, подходящую для использования, поэтому он не дает большого преимущества включать его в заголовки математики.
Ответ 6
Отредактировано - удалить необходимый термин, потому что он оказался спорным. Это слишком много абсолютного термина.
C++ - большой и сложный язык, поэтому Комитет по стандартам включает только те вещи, которые требуются. Насколько это возможно, оставлены неязычные стандартные библиотеки... например Boost.
повышение :: Math :: константы