2014-05-20 26 views
0

三角法是如何處理二元角度的?如何用二進制角度計算正弦?

假設我的360°或2pi角度從0到給定無符號整數類型的最大值,如何用這種表示法計算sin和所有其他函數?

什麼是通用算法?


編輯

我的觀點是將降大任浮點運算或浮點型,我想只有無符號整數來實現這一點。

+0

問題不明確 – MBo

+0

@MBo哪部分不清楚? – user2485710

+0

你是什麼意思「二元角」?什麼值的整數必須匹配到2Pi?罪(i * Pi * coeff)等有什麼問題? – MBo

回答

1

我打算假設您的無符號類型上升到UINT_MAX,您的意思是360°代表兩個UINTMAX + 1的冪。

在這種情況下,它是很簡單的:使用標準的肥胖型三角函數sinpi()其中,當施加到x,計算SIN(πx)。具有32位unsigned int

一個例子:

sinpi((double)n * 0x1.0p-31) 

請注意,轉換到double和乘法都是精確的,這意味着最終結果是一樣精確sinpi()是。您可以在CRlibm內找到最準確的雙精度sinpi

+0

你能擴展算法多一點嗎?可以用無符號整數來保存所有內容嗎?這就是我想要做的。例如,只需使用'uint32_t'作爲角度和任何相關的操作。 – user2485710

+0

@ user2485710哦,你在問如何實現你自己的正弦函數。你的問題沒有說清楚。好消息是,隨着你的選擇,減少論證將變得簡單。你甚至可以將接近π/ 2的正弦實現問題替換成接近0的餘弦問題。壞消息是你的問題仍然缺乏很多必要的信息來指導一個有用的答案。你在尋找什麼樣的準確性?您是否已經使用某種系統來幫助您進行定點計算,或者您希望我們爲您解決這個問題嗎? ... –

+0

@ user2485710當我說「有了你的選擇」時,我的意思是「當我決定在我的回答中做出的可能選擇」。您的問題實際上並未說明將UINTMAX + 1用於360°。 –

1

我曾經基於CORDIC算法實現了這個功能。對於二進制角度,算法只是微不足道的。對於x = 0,初始化一個n位二進制角和一個向量[cos(x),sin(x)]。對於每個位,從MSB到LSB,只需施加一部分的旋轉部分tau(或pi)。旋轉矩陣可以預先計算。該算法花費最多4次加法和2次乘法,乘以二進制角度中設置的位數。

但是!真正的問題是,你如何表示你的sin(x)和cos(x)的結果值。它們可以是固定點,也可以是浮點數......主要的問題是爲它們有效地實現增加和乘法。