2016-12-29 64 views
1

我是用PHP中的sincos功能试验,我发现这个代码:PHP的正弦,余弦的工作奇怪

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

返回PI。然而,这段代码:

echo asin(sin(pi())); 

,你可能会认为将地方给附近PI(取的正弦的反正弦)实际上返回此:

1.2246467991474E-16 

我通过PHP手册上正弦读取和这样,但我仍然不知道为什么这是这样工作,以及它是如何工作的。

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

+1

确认pi的罪的弧是零:https://www.google.com/#q=arcsin(sin(pi))。您生产的小值可能是由于浮点错误。 – nvioli

+0

你不应该在'pi()'上使用'deg2rad'(除非你想把3.141 ...度转换成弧度)。 – chtz

回答

0

你的第一个函数将实际计算

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之间的值。

0

0度,180度(pi弧度),360度(2 * pi弧度)等的窦都等于0

因此,取这个结果的弧(0)会让你0回来。

编辑:关于数学:从0到360度(0 - 2 * PI弧度)时,将窦-1和1及你能任何有效数量反正弦值之间波动取(在-1和1之间)的弧度将始终返回-0.5 * pi和0.5 * pi之间的数字。所以它永远不会是pi。

看一个简单的例子here

+0

这不是关于它的数学方面,而是PHP方面。我知道任何pi的倍数的正弦都是0.我在问为什么我的PHP没有返回。 – TricksfortheWeb

+0

@TicksoftheWeb请参阅我的编辑。 – jeroen

+0

如果我有一个数字'x'并且取其正弦,那么我应该使用什么函数来返回该数字或接近该数字的数字?例如,如果我给函数4的正弦,它会让我回到〜3.9。 – TricksfortheWeb

0

至于sin(x)=x+O(x^3),对于小的因素e和介质尺寸参数x你得到

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

从角度到弧度的转换因子pi/180可以指望足够小,使得高阶项不影响第一数字太多了。但在任何情况下,您的第一个实验结果都不是pi