我是用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