2011-10-11 115 views
1

最近我在qmath.h中發現了兩個數學函數qFastSinqFastCos。這些功能是inline並使用查找表來計算sin和cos的價值:我搜索谷歌和Qt的助理有關它們的信息qFastSin和qFastCos(速度,安全和精度)

inline qreal qFastSin(qreal x) 
{ 
    // Calculating si would be more accurate with qRound, but slower. 
    int si = int(x * (0.5 * QT_SINE_TABLE_SIZE/M_PI)); 
    qreal d = x - si * (2.0 * M_PI/QT_SINE_TABLE_SIZE); 
    int ci = si + QT_SINE_TABLE_SIZE/4; 
    si &= QT_SINE_TABLE_SIZE - 1; 
    ci &= QT_SINE_TABLE_SIZE - 1; 
    return qt_sine_table[si] + (qt_sine_table[ci] - 0.5 * qt_sine_table[si] * d) * d; 
} 

inline qreal qFastCos(qreal x) 
{ 
    // Calculating ci would be more accurate with qRound, but slower. 
    int ci = int(x * (0.5 * QT_SINE_TABLE_SIZE/M_PI)); 
    qreal d = x - ci * (2.0 * M_PI/QT_SINE_TABLE_SIZE); 
    int si = ci + QT_SINE_TABLE_SIZE/4; 
    si &= QT_SINE_TABLE_SIZE - 1; 
    ci &= QT_SINE_TABLE_SIZE - 1; 
    return qt_sine_table[si] - (qt_sine_table[ci] + 0.5 * qt_sine_table[si] * d) * d; 
} 

,但沒有很好的文件建立。

有人知道這些功能的精度和性能嗎? (特別精準)

回答

7

他們不是公共API的一部分,不支持,沒有記錄,並可能會改變。

Qt只記錄它支持的內容,並且它only supports what it documents。這很好。

它看起來像一個簡單的線性插值,因此精度取決於QT_SINE_TABLE_SIZE以及輸入碰巧是多麼接近採樣點。那麼最壞的情況下誤差將1-sin(pi/2 + 2*pi*(QT_SINE_TABLE_SIZE/2))

如果你關心性能超過精度那麼您可以在實踐中使用它們,但在理論上他們可能會在未來完全刪除。