C++ qFastSin和qFastCos(速度、安全性和精度)

C++ qFastSin和qFastCos(速度、安全性和精度),c++,api,qt,math,C++,Api,Qt,Math,最近我在qmath.h中发现了两个数学函数,分别命名为qFastSin和qFastCos。这些函数是内联的,使用查找表计算sin和cos的值: 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 -

最近我在
qmath.h
中发现了两个数学函数,分别命名为
qFastSin
qFastCos
。这些函数是内联的,使用查找表计算sin和cos的值:

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;
}
我在Google和Qt Assistant上搜索了关于它们的信息,但没有好的文档


有人知道这些函数的精度和性能吗?(特别精确)

它们不属于公共API的一部分,不受支持,也没有文档记录,并且可能会发生更改

Qt只记录它支持的内容和它的特性。这样很好

它看起来像一个简单的线性插值,因此精度取决于
QT\u SINE\u TABLE\u SIZE
以及输入与采样点的距离。更糟糕的情况是
1-sin(pi/2+2*pi*(QT\u SINE\u TABLE\u SIZE/2))


如果您更关心性能而不是准确性,那么您可以在实践中使用它们,但从理论上讲,它们可能会在将来被完全删除。

它们不是公共API的一部分,不受支持,没有文档记录,并且可能会发生更改

Qt只记录它支持的内容和它的特性。这样很好

它看起来像一个简单的线性插值,因此精度取决于
QT\u SINE\u TABLE\u SIZE
以及输入与采样点的距离。更糟糕的情况是
1-sin(pi/2+2*pi*(QT\u SINE\u TABLE\u SIZE/2))

如果您更关心性能而不是准确性,那么您可以在实践中使用它们,但在理论上,它们可能会在将来被完全删除