PHP正弦,余弦工作奇怪



我正在尝试PHP中的sincos函数,我注意到这段代码:

echo rad2deg(sin(deg2rad(pi())));

返回 pi。但是,此代码:

echo asin(sin(pi()));

你会认为它会在 pi 附近的某个地方给出(取正弦的反正弦)实际上返回以下内容:

1.2246467991474E-16

我通读了关于正弦等的 PHP 手册,但我仍然无法弄清楚为什么它会这样工作以及它是如何工作的。

有谁知道这应该如何工作?

你的第一个函数实际上会计算

180/pi*sin(pi*pi/180)

它"接近"pi(两位数),因为pi*pi/180相对较小,而对于小值,sin(x) 大约是 x。

对于你的第二个代码段,应该知道pi()不能返回确切数量的 pi,而只能返回一个精确到 53 个二进制数字。 事实上,如果你计算(以更高的精度)eps=frac(pi*2^52)/2^52你会得到大约 1.2246467991474E-16.,所以sin(pi())=sin(pi-eps)=-sin(-eps)=sin(eps) ~= eps.当然,asin无法猜测哪个是传递给sin的原始值,所以它将始终返回一个介于 -pi/2 和 +pi/2 之间的值。

正如sin(x)=x+O(x^3),对于小因素e和中型参数x你得到

1/e*sin(e*x) = x + O(e^2*x^3)

从度到弧度pi/180转换因子可以算得足够小,以便高阶项不会对第一位数字产生太大影响。但在任何情况下,您的第一个实验的结果都不完全pi

0 度、180 度(圆周率弧度)、360 度(2*圆周率弧度)等的正弦都是0

因此,取该结果(0)的反方矩会让你0回来。

编辑:这是关于数学的:从0到360度(0 - 2 * pi弧度),窦将在-1和1之间波动。您可以采用的任何有效数字的 arcsin 值(介于 -1 和 1 之间...)将始终返回 -0.5*pi 和 0.5*pi 之间的数字。所以它永远不可能是圆周率。

请参阅此处的简单示例。