如何用查表替代運算

2021-04-01 16:44:45 字數 1146 閱讀 1097

對於sin,cos,tan等三角函式來說,使用cpu/fpu計算所花費的時間比加減法員算要慢很多的時間

這就使得在很多密集的三角運算花費了大量的時間,如何在保證一定精度的情況下,使用近似的方法來獲取這些函式的數值呢

常規的做法,就是犧牲空間換取時間的查表法

需要注意的是,查表法不是萬能的,必須針對特定的函式特殊處理,拿sin(x)作為例子來說

把x從0到90度,每0.01乙個單位,把每個點的sin數值計算出來,儲存到乙個長度9000的表當中去

那麼這個時候的精度是0.01嗎?

不是精度說的是,sin(x)的實際數值和查表獲得的數值之間的差,要控制精度,就要按照精度來劃分值域空間而不是定義域空間,sin(x)在0-90的定義域內值域是0到1,按照0.01劃分,只需要100個數值就是了

建立乙個長度100的表,把0到1之間的值域分割點的asin數值寫入其中(顯然表內資料不是等間距的)

具體的計算x的時候,檢查這個表,找到x位於哪兩個下標所對應的範圍內,從而根據下標×0.01獲得對應的sin數值。

但是這個查表顯然和第一種方式的查表的速度無法相比

如果,對於給定的精度,我們能夠確定乙個最小的間隔,以這個間隔來劃分定義域的話就好了

其實這個問題很好解決,我們可以通過計算導數來判斷sin函式,在什麼地方數值變化最大,也就是導數數值最大,顯然sin的導數是cos,在0的時候最大

因此假定精度是0.01,我們只要計算asin(x)=0.01,x=0.057,為了方便我們取0.05作為間隔,把0到90度的定義域均分成為180份就可以了

對比一下,可以發現,如果直接按照0.01的精度劃分定義域,需要9000表長

如果按照精度0.01劃分值域,需要表廠100,但是查表的時間不容忽視

按照上述方法,需要180表長,效率一樣。

乙個特殊函式的查表法:

對於lnx函式,我們知道是可以用 log2(x)/ln(2)的方式來計算

x = 1.m ×2^n

log2對於pc計算機來說,可以通浮點數的記憶體結構直接提取出來log2的整數部分n,

對於尾數部分,我們建立乙個1.0到2.0之間的尾數表,通過浮點數在pc當中的記憶體結構獲取到x的小數部分m,然後直接把他轉化成為整數作為表的索引數值就可以了。這樣的表的精度一點都不損失。

還可以根據實際的精度要求,只選擇m的高幾位來降低表的長度。

c 如何用組合替代繼承

如果問物件導向的三大特性是什麼,多數人都能回答出來 封裝 繼承 多型。繼承 作為三大特性之一,近來卻越來越不推薦使用,更有極端的語言,直接語法中就不支援繼承,例如 go。這又是為什麼呢?假設我們要設計乙個關於鳥的類。我們將 鳥類 定義為乙個抽象類abstractbird。所有更細分的鳥,比如麻雀 鴿...

查表替換複雜運算

一些複雜運算的值很有可能被重複用到!但是看上去它們可能並不顯眼,所以程式設計師往往忽略了它們的影響。請看下面這段示例 floatpercentage int array,intlength,int parameter1,intparameter2,return float sum float len...

如何替代Flex?

actionscript是一門特殊的語言。配合flashplayer執行環境,能夠帶來非常優秀的視覺體驗。我不知道還有那種開發語言能夠如此輕鬆地創造出如此豐富多彩的ui介面。可以說,actionscript是開發網路應用前端ui的最具創造性地語言。是唯一而不是之一。替代flex的產品特質,最重要的一...