1

我正在做一个新项目,我正在尝试编写最干净、最容易阅读并且希望是最有效的代码。

我需要使用 PI,但显然它没有在 math.h 中定义。所以我读到这样做:

const double PI = atan(1.0)*4

但我得到这个错误:

函数调用不能出现在常量表达式中

关于为什么的任何想法?如何将 PI 设为常数?

另外,拜托,我正在尝试通过这个项目尽可能多地学习,所以如果你也能解释为什么你的答案会奏效,那就太好了。谢谢!

4

4 回答 4

7

怎么样:

const double PI = 3.1415926535897932384626433832795028841971693993751058209;

在我看来,这比atan(1.0)*4.

于 2012-01-27T21:54:04.247 回答
5

您错误地标记了问题。在 C++ 中,以下是明确定义的并将编译:

#include <math.h>

const double PI = atan(1.0)*4;

但是在 C 中,不允许在文件范围内使用初始化程序。

在 C 语言中,您要么需要使用非标准宏(例如M_PI在 GCC 中),要么创建自己的适当宏或文字(Ned Batchelder 已为您完成了困难的部分),或者在您自己的函数中适当地初始化它时间够早。

于 2012-01-27T21:56:51.143 回答
2
#include <math.h>

const double PI = M_PI;

您不能为全局调用函数,const double因为需要在编译时评估常量。在运行时atan()可以是任何东西。您可以安排它在启动时调用一次,但使用已经可用的实际 PI 常数会更好。

(其实M_PI直接使用也不错)

编辑:一年多后,我花了很多评论和重新阅读我自己的答案,以了解为什么人们对我关于常量的陈述持反对态度。我跳过了一步:正如大家所说,您可以const double在运行时初始化,就像double. 但是,如果您使用全局变量(而不是常量表达式)来存储 pi,您将失去一些优化机会。一些实验gcc表明这甚至没有我想象的那么糟糕,这提出了一个全新的问题......

于 2012-01-27T21:45:37.343 回答
0

汇编语言怎么样?

fldpi

它只是使用浮点指令的替代方案

于 2020-07-05T15:15:36.443 回答