Из того что вспоминал по ходу поиска:
- Это была интерполяция на основе кубического сплайна;
- Но по малому количеству точек - буквально, 4 соседние точки - чтобы не считать много коэффициентов;
- Была статья/заметка, где рассматривался такой вариант, из неё и взял принцип;
- Из-за малого количества точек, вся кубичность вырождалась в перемножения/сложения. Может, было деление - не помню, но вычислений корней и прочего тяжёлого - не было.
И, вроде бы, оно работало и для иррегулярной сетки исходных данных (ваш случай для оптимизации размеров корректировочных таблиц).
К сожалению, не помню большего. Некоторые проекты, где оно было, не попали в бекапы или я их просто ещё не смог найти...
UPD:
Обидно стало. Напрягся и нашёл из принципа. Результат дал поиск на английском языке.
Использовал "Parabolic (quadratic) spline interpolation". Вот пример от ИИ Гугла:
typedef struct {
float x;
float y;
} Point;
float eval_parabolic_spline(float x, Point p1, Point p2, Point p3) {
// This example uses simple 3-point Lagrange-based parabolic interpolation
// p1 = (x_{i-1}, y_{i-1}), p2 = (x_{i}, y_{i}), p3 = (x_{i+1}, y_{i+1})
float x1 = p1.x, y1 = p1.y;
float x2 = p2.x, y2 = p2.y;
float x3 = p3.x, y3 = p3.y;
float term1 = y1 * ((x - x2) * (x - x3)) / ((x1 - x2) * (x1 - x3));
float term2 = y2 * ((x - x1) * (x - x3)) / ((x2 - x1) * (x2 - x3));
float term3 = y3 * ((x - x1) * (x - x2)) / ((x3 - x1) * (x3 - x2));
return term1 + term2 + term3;
}Всё-таки три деления. Но вроде, оно-самое. По трём точкам (помню, что по трём). Код нужно проверять - это ИИ. С целыми числами тоже будет работать.