qFastSin и qFastCos (скорость, безопасность и точность) - PullRequest
1 голос
/ 11 октября 2011

Недавно я нашел две математические функции в 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;
}

Я искал в Google и Qt-Assistant информацию о них, но нет хорошей документации.

Кто-нибудь знает о точности и производительности этих функций? (Специальная точность)

1 Ответ

8 голосов
/ 11 октября 2011

Они не являются частью общедоступного API, не поддерживаются, не документируются и могут быть изменены.

Qt только документирует, что он поддерживает, а поддерживает только то, что он документирует . Это так хорошо.

Это выглядит как простая линейная интерполяция, поэтому точность зависит от QT_SINE_TABLE_SIZE, а также от того, насколько близко к точке выборки находится вход. В худшем случае ошибка будет 1-sin(pi/2 + 2*pi*(QT_SINE_TABLE_SIZE/2))

Если вы заботитесь о производительности больше, чем о точности, то вы можете использовать их на практике, но теоретически они могут быть полностью удалены в будущем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...