如果您需要超過-π...π,使用絕對精度優化正弦值的近似值:
X *(1 + X * X *(-0.1661251158026961831813227851437597220432 + X * X *(8.03943560729777481878247432892823524338e-3 + X * X * -1 。
float xx = x * x;
float s = x + (x * xx) * (-0.16612511580269618f + xx * (8.0394356072977748e-3f + xx * -1.49414020045938777495e-4f));
也許optimized depending on the characteristics of your target architecture:4941402004593877749503989396238510717e-4))
它可以實現。另外,在鏈接的博客文章中沒有提到,如果您正在使用匯編實現這一點,請使用FMADD
指令。如果使用C或C++實現,如果使用的是例如fmaf()
C99標準函數,請確保生成FMADD
。仿真版本比乘法和加法要昂貴得多,因爲fmaf()
所做的並不完全等同於乘法和加法(因此僅實現它是不正確的)。
罪之間的差異(x)和在-π到π圖之間的上述多項式這樣:
的多項式優化降低它和sin之間的差(X)之間-π和π,不只是有人認爲是一個好主意的東西。
如果您只需要[-1 ... 1]定義間隔,則可以通過忽略其餘部分使多項式在該間隔內更加準確。該定義間隔再次運行the optimization algorithm生產:
X *(1 + X * X *(-1.666659904470566774477504230733785739156e-1 + X * X *(8.329797530524482484880881032235130379746e-3 + X * X *( - 1.928379009208489415662312713847811393721e-4) ))
的絕對誤差圖:
如果這是你太準確,有可能optimize a polynomial of lower degree for the same objective那麼絕對誤差會大一些,但你能救一個或兩個倍增。
這可能證明有用:[「使用Intel的SSE2指令的快速三角函數」](http://users.ece.utexas.edu/~adnan/comm/fast-trigonometric-functions-using.pdf) –
@AlexReinking謝謝,但該文件看起來像幾個選項的概述,加上我認爲不會有用的半頁代碼,至少在我的情況下。 – user2485710
你能更具體地說明你爲什麼認爲SSE2不會幫助你的情況嗎? –