Я реализовал эталонную программу для сравнения эффекта различных выражений.
Я вычислил y с использованием двойной точности, а затем вычислил y с использованием одинарной точности с разными выражениями
Вот проверенное выражение:
inline double getYDbl( double x, double x0, double y0, double x1, double y1 )
{
double const t = (x - x0)/(x1 - x0);
return y0 + t*(y1 - y0);
}
inline float getYFlt1( float x, float x0, float y0, float x1, float y1 )
{
double const t = (x - x0)/(x1 - x0);
return y0 + t*(y1 - y0);
}
inline float getYFlt2( float x, float x0, float y0, float x1, float y1 )
{
double const t = (x - x0)*(y1 - y0);
return y0 + t/(x1 - x0);
}
inline float getYFlt3( float x, float x0, float y0, float x1, float y1 )
{
double const t = (y1 - y0)/(x1 - x0);
return y0 + t*(x - x0);
}
inline float getYFlt4( float x, float x0, float y0, float x1, float y1 )
{
double const t = (x1 - x0)/(y1 - y0);
return y0 + (x - x0)/t;
}
Я вычислил среднее значение и стандартное отклонение разницы между результатом двойной точности и результатом одинарной точности.
Результатом является то, что в среднем нет 1000 или 10К случайных значений. Я использовал компилятор icc с оптимизацией и без нее, а также g ++.
Обратите внимание, что мне пришлось использовать функцию isnan () для фильтрации поддельных значений. Я подозреваю, что это результат недостаточного различия или разделения.
Я не знаю, перекомпилируют ли компиляторы выражение.
В любом случае, из этого теста можно сделать вывод, что приведенные выше перестановки выражения не влияют на точность вычислений. Ошибка остается прежней (в среднем).