最近,我发现了两个数学函数的qmath.h命名qFastSin和qFastCos.这些函数是inline并使用查找表来计算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;
}
Run Code Online (Sandbox Code Playgroud)
我搜索了Google和Qt-Assistant以获取有关它们的信息,但没有好的文档.
有人知道这些功能的精度和性能吗?(特别精确)
它们不是公共API的一部分,不受支持,没有记录,可能会有变化.
Qt只记录它支持的内容,它只支持它所记录的内容.这很好.
它看起来像一个简单的线性插值,因此精度取决于QT_SINE_TABLE_SIZE输入恰好与采样点的接近程度.那么更糟糕的情况就是错误1-sin(pi/2 + 2*pi*(QT_SINE_TABLE_SIZE/2))
如果你关心的是性能而不是准确性,那么你可以在实践中使用它们,但理论上它们将来可能会被完全删除.
| 归档时间: |
|
| 查看次数: |
542 次 |
| 最近记录: |