標籤:

為什麼tan 90°拿計算器算出來是1.63312394e16?

高中生很迷啊,是二進位演算法問題還是別的什麼,tan90不是sin90/cos90嗎,cos90不應該是0所以tan90無意義不存在嗎??


復現了一下這個問題.

tan 90°毫無疑問是不存在的,問題出在浮點演算法上.

name問題來了...計算機計算正切值用的是哪種演算法...

=====================================

如果是泰勒法,已知 Tan 的泰勒展式為

	an (x)=x+frac{{{x}^{3}}}{3}+frac{2{{x}^5}}{15}+frac{17{{x}^{7}}}{315}+frac{62{{x}^{9}}}{2835}+frac{1382{{x}^{11}}}{155925}+Oleft( {{x}^{13}} 
ight)

但是直接展開tan的話誤差顯然不是這個樣子的

------------------------------------------------------------------------------------

不過據我所知計算機計算用的就是查表+泰勒...

那麼答案就是用了間接泰勒而非直接泰勒(因為直接泰勒有收斂域的問題啊)

這次比較接近了,在20次的截斷誤差下達到了這個數量詞.

--------------------------------------------------------------------------------------

最後還是有一點點小小的誤差...name這部分誤差就是來自查表了

查表的話我也不知道表裡具體寫的啥了...

不過注意到

1/1.633123935319537`*^16 = 6.123233995736766`*^-17 = Cos[90.0°]

所以整個計算過程就是

Tan[90.0°]=1/Cos[90.0°]
=查表= 1/6.123233995736766`*^-17
=計算=1.633123935319537`*^16


歪個樓。

在 tan90° 等於多少這個問題上,Google 百度達成了一致:

反而是我們冷落已久的 Bing,給出了不一樣的意見:

驚不驚喜,意不意外?


說個通俗易懂的解釋

可以看到,16位小數和18位小數計算結果一樣

正如樓上所說,精度問題,通俗點講,保留位數

因為89.99999999999999無限循環=90

當你輸入90時,計算器獲取的是89.99999999(特定的個數的9)一個確切的值

而這個值等於1.63312394e16

不同計算器保留的位數也不同

—————————————————————————————————————————

小插曲,帶有一定負能量,不想影響心情請跳過:

當我在群里討論完得出結論時,有個人跳了出來

然而百度上我沒找到現成的能讓人一目了然的答案

反擊:

冷嘲熱諷:

正確的做法:

也不是我小心眼,此人日常的言語正如此一般膚淺狹隘

自己不思考,還要嘲諷別人思考,真是噁心


計算器是用雙精度浮點數表示90°的,但是90°不能用二進位數精確表示。如果保留40位小數,就可以明顯看到雙精度和精確值的區別:

雙精度:90.0° = 1.57079 63267 94896 55799 89817 34272 09258 07952...

精確值:90.0° = 1.57079 63267 94896 61923 13216 91639 75144 20985...

Tan本身也並沒有算錯,因為它收到的參數本來就不是精確的90°。

Tan[90 Degree]
(* ComplexInfinity *)

Tan[1.5707963267948965579989817342720925807952``40]
(* 1.63312393531953697559677*10^16 *)


計算機中有個潛規則:

一個用科學計數法表示的數值,別管它e左邊是幾點几几幾,

如果e右邊的數值大於10,當左邊為正數時,那你就當它是正無窮;當左邊為負數時,那你就當它是負無窮。

如果e右邊的數值小於-10,那你就當它是0。

所以:

當看到1.63312394e16,你就當它是正無窮;

當看到-1.63312394e16,你就當它是負無窮;

當看到1.63312394e-16,你就當它是0。

還有:

當看到1.00000001,你就當它是1;

當看到0.99999998,你就當它是1。

不要糾結為什麼,你就當它是烏龜的屁股----規定!


計算機數學庫裡面的三角函數,大都用弧度作為單位。弧度制的90度是pi/2,不是一個有限長度浮點數能精確表達的值,離數學意義上的pi/2有精度誤差。

於是,你在算tan(90)的時候,並沒有在算精確的tan(pi/2),而是在算tan(1.5707963)左右的一個數,沒準連觸發+inf的機會都沒有。

嘗試了一下:

$ perl -MMath::Trig -E "say tan(pi/2)"
1.63312393531954e+16

Perl的算數運算用的是雙精度浮點,說明題主用的是類似的函數。


這說明你拿錯計算器了,像我用的這款給出來的就是Math error。


如果是你的計算器採用浮點數計算的話 存在誤差是正常的 因為pi/2不是精確的pi/2 tan的計算應該也是基於查表或者泰勒展開的

不過支持計算機代數系統的環境裡面會得到正確結果


因為計算器並不是真的按照最直接的數學過程來計算這些tan啊e啊的。

如果題主說的計算器是手持的那種,那計算方法還可能是坐標旋轉數字計演算法這類的硬體演算法。

(手機打字沒法插圖)

在直角坐標系下,將點x1,y1以原點旋轉a度,得到x2,y2。

x2=x1cosa - y1sina

y2=x1sina + y1sina

提出cosa,得到關於tana的表達式。

忽略所提出的cos項,就是偽旋轉的表達式。偽旋轉後向量長度增加至cosa分之一倍。

而一些tan角度的值,會等於2^-n,如tan45° =1/2,26點幾是1/4。

在偽旋轉公式里加上z^(n+1) =z^(n) -d*a^(n),作為角度累加公式,就可以通過設定不同的初始值,來迭代計算sin,cos,tan等。

在雙曲線坐標系下,還可以計算e^b和lna來間接計算指數a^b。

由於是迭代演算法,迭代次數越多精度越高,越趨近,但基本一定存在誤差,所以很容易把tan90計算成這個樣子。


我的計算器顯示undef。。


雙精度計算一般是16位有效數字。


說明肥宅單身狗可以在虛幻世界中找到女朋友,但那不是真的。


既然問題已經解決,我就補個函數圖像繪畫APP的截圖,和題目一樣的結果也。


加一句,Python的numpy也有這問題

&>&>&> np.tan(np.pi/2)

16331239353195370.0


這時候你需要TI


占坑,待我明天有計算器試試看。
補坑來了。看圖

計算器顯示數學錯誤,tan90不存在。嘿嘿。

題主的計算器可能報道上出了偏差?

歡迎評論區評論



在我眼裡沒有tan90度,我數學一向不太好,但作為一個男生我齒於說明這一點。我學的三角函數是幾何抽象的,只有直觀的三角幾何輔助理解記憶,還沒有和數值聯繫到一起。


應該是精度問題,90°計算器沒當成90°,用一個數字去逼近去了,我的卡西歐計算器按1÷3×3,結果會=0.999999999,1÷3計算器沒有算為1/3,而是記為0.33333333

不過,手機上小米計算器1÷3×3=1,但tan90=1.63312394×1016,分裂的小米


推薦閱讀:

斐波那契數列的通項公式
拉格朗日定理與羅爾定理,柯西定理啥關係?
斐波那契數列第8項,21=3*7是什麼意思?

TAG:高中數學 |