gri*_*fos 75
在C中,在math.h中定义: #define M_PI 3.14159265358979323846
R..*_*R.. 24
C以对应用程序直接可见的方式"计算π"所做的最接近的事情是acos(-1)或类似的.对于所计算的函数(在C中或由FPU微码),这几乎总是用多项式/有理近似来完成.
然而,一个有趣的问题是,计算三角函数(sin,cos,和tan)要求减少他们的说法模为2π的.由于2π不是二元有理(甚至不理性),它不能用任何浮点类型表示,因此使用该值的任何近似将导致大参数的灾难性错误累积(例如,如果x是1e12,并且2*M_PI不同于2π通过ε,则fmod(x,2*M_PI)与正确的2π值相差最多1e12*ε/π乘以xmod2π 的正确值.也就是说,它完全没有意义.
C语言标准数学库的正确实现只是在其源代码中有一个巨大的非常高精度的π硬编码表示,以处理正确的参数减少问题(并使用一些花哨的技巧使其不那么巨大).这就是sin/ cos/ tan函数的大多数/所有C版本的工作方式.但是,某些实现(如glibc)已知在某些cpus(如x86)上使用程序集实现,并且不执行正确的参数减少,从而导致完全无意义的输出.(顺便提一下,不正确的asm通常与小参数的正确C代码运行速度大致相同.)
Mar*_*vič 20
只需定义:
#define M_PI acos(-1.0)
Run Code Online (Sandbox Code Playgroud)
它应该为您提供数学函数正在使用的精确PI编号.因此,如果他们改变PI值,他们正在使用正切或余弦或正弦,那么您的程序应该始终是最新的;)
无论如何,你没有无限的准确性,所以C用这种方式定义一个常数:
#define PI 3.14159265358979323846
Run Code Online (Sandbox Code Playgroud)
导入math.h来使用它