我是用PHP中的sin
和cos
功能试验,我发现这个代码:PHP的正弦,余弦的工作奇怪
echo rad2deg(sin(deg2rad(pi())));
返回PI。然而,这段代码:
echo asin(sin(pi()));
,你可能会认为将地方给附近PI(取的正弦的反正弦)实际上返回此:
1.2246467991474E-16
我通过PHP手册上正弦读取和这样,但我仍然不知道为什么这是这样工作,以及它是如何工作的。
有谁知道这应该如何工作?
我是用PHP中的sin
和cos
功能试验,我发现这个代码:PHP的正弦,余弦的工作奇怪
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之间的值。
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。
这不是关于它的数学方面,而是PHP方面。我知道任何pi的倍数的正弦都是0.我在问为什么我的PHP没有返回。 – TricksfortheWeb
@TicksoftheWeb请参阅我的编辑。 – jeroen
如果我有一个数字'x'并且取其正弦,那么我应该使用什么函数来返回该数字或接近该数字的数字?例如,如果我给函数4的正弦,它会让我回到〜3.9。 – TricksfortheWeb
至于sin(x)=x+O(x^3)
,对于小的因素e
和介质尺寸参数x
你得到
1/e*sin(e*x) = x + O(e^2*x^3)
从角度到弧度的转换因子pi/180
可以指望足够小,使得高阶项不影响第一数字太多了。但在任何情况下,您的第一个实验结果都不是pi
。
确认pi的罪的弧是零:https://www.google.com/#q=arcsin(sin(pi))。您生产的小值可能是由于浮点错误。 – nvioli
你不应该在'pi()'上使用'deg2rad'(除非你想把3.141 ...度转换成弧度)。 – chtz