2016-12-29 67 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