我正在尝试PHP中的sin
和cos
函数,我注意到这段代码:
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 之间的数字。所以它永远不可能是圆周率。
请参阅此处的简单示例。