Я хотел бы найти способ сделать вычисления более высокой точности в вычислительном шейдере, используя несколько чисел с плавающей точкой для представления одного числа.
Моя цель - рендерер Мандельброта, где вы можете масштабировать глубже, чем обычная точность с плавающей точкой разрешит. Производительность не слишком важна, поскольку она будет рассчитана только один раз и сохранена в текстуре.
Я тестирую алгоритмы в C#. До сих пор мне удалось добавить 2 числа с достаточной точностью:
double a = Math.PI * 10;
double b = Math.E * .1;
double c = a + b;
float ax = (float)a;
float ay = (float)(a - ax);
float bx = (float)b;
float by = (float)(b - bx);
float cx = ax + bx;
float cy = 0;
if (Math.Abs(ax) > Math.Abs(bx)) {
cy = -cx + ax + bx + ay + by;
} else {
cy = -cx + bx + ax + by + ay;
}
// cx + (double)cy =
// 0 10000000011 1111101100000001000010110001011110001010110010100000 | 31.68775471874380
// c = 0 10000000011 1111101100000001000010110001011110001010110010101001 | 31.68775471874380
Расширение этого алгоритма до 3 чисел с плавающей запятой делает сумму точно равной двойному значению.
Можете ли вы придумать способ умножить два из этих чисел? И если вам весело, деление или инвертирование (затем умножение) числа, может быть. Другие вычисления можно разбить на mul и добавить.
(я также открыт для других методов получения изображения с большим увеличением набора Мандельброта.)
Заранее спасибо!