我正在做一个新项目,我正在尝试编写最干净、最容易阅读并且希望是最有效的代码。
我需要使用 PI,但显然它没有在 math.h 中定义。所以我读到这样做:
const double PI = atan(1.0)*4
但我得到这个错误:
函数调用不能出现在常量表达式中
关于为什么的任何想法?如何将 PI 设为常数?
另外,拜托,我正在尝试通过这个项目尽可能多地学习,所以如果你也能解释为什么你的答案会奏效,那就太好了。谢谢!
我正在做一个新项目,我正在尝试编写最干净、最容易阅读并且希望是最有效的代码。
我需要使用 PI,但显然它没有在 math.h 中定义。所以我读到这样做:
const double PI = atan(1.0)*4
但我得到这个错误:
函数调用不能出现在常量表达式中
关于为什么的任何想法?如何将 PI 设为常数?
另外,拜托,我正在尝试通过这个项目尽可能多地学习,所以如果你也能解释为什么你的答案会奏效,那就太好了。谢谢!
怎么样:
const double PI = 3.1415926535897932384626433832795028841971693993751058209;
在我看来,这比atan(1.0)*4
.
您错误地标记了问题。在 C++ 中,以下是明确定义的并将编译:
#include <math.h>
const double PI = atan(1.0)*4;
但是在 C 中,不允许在文件范围内使用初始化程序。
在 C 语言中,您要么需要使用非标准宏(例如M_PI
在 GCC 中),要么创建自己的适当宏或文字(Ned Batchelder 已为您完成了困难的部分),或者在您自己的函数中适当地初始化它时间够早。
#include <math.h>
const double PI = M_PI;
您不能为全局调用函数,const double
因为需要在编译时评估常量。在运行时atan()
可以是任何东西。您可以安排它在启动时调用一次,但使用已经可用的实际 PI 常数会更好。
(其实M_PI
直接使用也不错)
编辑:一年多后,我花了很多评论和重新阅读我自己的答案,以了解为什么人们对我关于常量的陈述持反对态度。我跳过了一步:正如大家所说,您可以const double
在运行时初始化,就像double
. 但是,如果您使用全局变量(而不是常量表达式)来存储 pi,您将失去一些优化机会。一些实验gcc
表明这甚至没有我想象的那么糟糕,这提出了一个全新的问题......
汇编语言怎么样?
fldpi
它只是使用浮点指令的替代方案