math常数PI值在C
计算PI值是一个复杂的问题,维基百科讨论了它的近似值 ,并说很难精确计算PI。
C如何计算PI? 它是每次计算还是使用不太准确的固定值?
在C中Pi是在math.h中定义的: #define M_PI 3.14159265358979323846
C对于以应用程序直接可见的方式“计算π”最接近的是acos(-1)
或类似的东西。 这几乎总是用正在计算的函数的多项式/有理近似来完成(在C中,或者由FPU微码)。
然而,一个有趣的问题是,计算三angular函数( sin
, cos
和tan
)需要减less它们的参数模2π。 由于2π不是二元的理性(甚至不是理性的),所以它不能用任何浮点types来表示,因此使用任何近似值都会导致大的参数的灾难性的错误积累(例如,如果x
是1e12
和2*M_PI
与2π的差别是ε,则fmod(x,2*M_PI)
与2π的正确值相差fmod(x,2*M_PI)
的正确值的1e12 *ε/π倍,也就是说,这是完全没有意义的。
C的标准math库的一个正确的实现只是在源代码中有一个巨大的非常高精度的π表示,用来处理正确的参数减less的问题(并使用一些奇特的技巧使它不那么庞大)。 这就是sin
/ cos
/ tan
函数的大多数/所有C版本的工作原理。 然而,某些实现(如glibc)已知会在某些cpus(如x86)上使用汇编实现,并且不会执行正确的参数缩减,从而导致完全无意义的输出。 (顺便说一下,不正确的asm通常运行的速度与小参数的正确C代码大致相同。)
只要定义:
#define M_PI acos(-1.0)
它应该给你math函数正在使用的确切的PI号码。 所以,如果他们改变PI值,他们正在切线或余弦或正弦,那么你的程序应该永远是最新的;)
无论如何,你没有一个无限的精度,所以C这样定义一个常量:
#define PI 3.14159265358979323846
导入math.h来使用这个
根据你使用的库,标准的GNU C预定义的math常量在这里… https://www.gnu.org/software/libc/manual/html_node/Mathematical-Constants.html
你已经拥有了它们,为什么要重新定义它们呢? 你的系统桌面计算器可能有他们,甚至更准确,所以你可以但只是确保你没有冲突与现有的定义的节省编译警告,因为他们往往得到这样的事情的默认值。 请享用!