Intereting Posts
Является ли шаблон функции друга определенным в classе доступным для поиска? clang ++ и g ++ не согласны Компиляция Java Generics с шаблонами подстановок на C ++ Прочитайте файл в памяти, просмотрите данные, затем напишите файл Swig: конвертировать возвращаемый тип std :: string в java byte Возвращает ли локальный объект семантику перемещения? Как я могу сгенерировать массив обработчиков прерываний в C ++? Могу ли я иметь статические элементы данных в абстрактном classе? цикл через массив в c ++ cmake находит более одной основной функции выражение должно иметь постоянную ошибку значения в c ++ использовать оператор запятой для инициализации базового classа Как инициализировать массив classов с помощью конструктора удаленных копий (C ++ 11) Ошибка в BOOST_CHECK? Какой правильный тип для функции join_rows ()? Плагин doxygen eclipse автоматически генерирует документацию о заглушке?

Определение значения PI

Я работаю над новым проектом, и я пытаюсь написать самый чистый, самый легкий для чтения и, надеюсь, самый эффективный код, который я могу.

Мне нужно использовать PI, но, по-видимому, он не определен в математике. Поэтому я читал об этом:

const double PI = atan(1.0)*4 

Но я получаю эту ошибку:

Вызов функции не может появляться в константном выражении

Любые идеи о том, почему? Как я могу получить PI как константу?

Кроме того, пожалуйста, я стараюсь как можно больше узнать об этом проекте, так что было бы здорово, если бы вы также могли объяснить, почему ваш ответ будет работать. Спасибо!

 #include  const double PI = M_PI; 

Вы не можете вызывать функцию для глобального const double потому что константу нужно оценивать во время компиляции. Во время выполнения atan() может быть что угодно. Вы можете договориться о том, чтобы его вызывали один раз при запуске, но лучше использовать реальную константу PI, которая уже доступна.

(фактически использование M_PI напрямую также было бы хорошим)

РЕДАКТИРОВАТЬ: прошло много годовых комментариев и повторного чтения моего собственного ответа, чтобы понять, почему люди были в курсе моего заявления о константах. Я прыгал через шаг: поскольку все говорят, что вы можете инициализировать const double во время выполнения так же легко, как и double . Однако, если вы используете глобальную переменную (вместо постоянного выражения) для хранения pi, вы можете победить некоторые возможности оптимизации. Некоторые эксперименты с gcc предполагают, что это даже не так плохо, как я думал, что предлагает совершенно новый вопрос …

Как насчет:

 const double PI = 3.1415926535897932384626433832795028841971693993751058209; 

Мне кажется, что он чище, легче читать и эффективнее, чем atan(1.0)*4 .

Вы неверно отметили вопрос. В C ++ следующее четко определено и будет компилироваться:

 #include  const double PI = atan(1.0)*4; 

Но в C инициализаторы в области файла не допускаются.

В C вам нужно либо использовать нестандартный макрос (например, M_PI в GCC), создать свой собственный соответствующий макрос или литерал ( Ned Batchelder сделал для вас трудную часть ), либо инициализировать его в вашей собственной функции на надлежащим образом достаточно рано.