Более точные вычисления с плавающей точкой - PullRequest
1 голос
/ 22 марта 2020

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

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

Я тестирую алгоритмы в 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 и добавить.

(я также открыт для других методов получения изображения с большим увеличением набора Мандельброта.)

Заранее спасибо!

...