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

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

1 голос
/ 28 января 2012

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

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

const double PI = atan(1.0)*4

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

Не удается вызвать вызов функции в выражении с константой

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

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

Ответы [ 3 ]

7 голосов
/ 28 января 2012

Как насчет:

const double PI = 3.1415926535897932384626433832795028841971693993751058209;

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

5 голосов
/ 28 января 2012

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

#include <math.h>

const double PI = atan(1.0)*4;

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

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

2 голосов
/ 28 января 2012
#include <math.h>

const double PI = M_PI;

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

(на самом деле было бы неплохо использовать M_PI напрямую)

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

...